Servlet技术详解

1、实现第一个Servlet技术

(1)新建Java文件

新建Project--》web--》Dynamic Web Project,项目名ServletTest

在src(Java Resources/src)中新建包com/liuyanzhao

然后在包内新建类名 FirstServlet

FirstServlet.java文件代码如下

  1. package com.liuyanzhao;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import javax.servlet.GenericServlet;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.ServletRequest;
  7. import javax.servlet.ServletResponse;
  8. /*
  9.  * @author LiuYanzhao
  10.  */
  11. public class FirstServlet extends GenericServlet {
  12.     public void service(ServletRequest request,ServletResponse response) throws ServletException,IOException{
  13.         //得到输出流PrinterWriter对象,Servlet使用输出流来产生响应
  14.         PrintWriter out = response.getWriter();
  15.         //使用输出流对象向客户端发送字符数据
  16.         out.println("This is my First Servlet!");
  17.     }
  18. }

这时候,如果我们运行tomcat,在浏览器中输入url:http://localhost:8080/ServletTest/FirstServlet

Servlet技术详解

出现404,原因是没有映射对外访问的虚拟路径

具体配置方法请看第2步

(2)配置web.xml

在WebContent/WEB-INF中新建web.xml,具体代码可以参考tomcat安装目录中如下路径中的web.xml。

D:\java\apache-tomcat-7.0.72\webapps\examples\WEB-INF

这里我们的web.xml代码如下

  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <web-app xmlns="http://java.sun.com/xml/ns/javaee"
  3.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  5.                       http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  6.   version="3.0"
  7.   metadata-complete="true">
  8.     <servlet>
  9.         <servlet-name>FirstServlet</servlet-name>
  10.         <servlet-class>com.liuyanzhao.FirstServlet</servlet-class>
  11.     </servlet>
  12.     <servlet-mapping>
  13.         <servlet-name>FirstServlet</servlet-name>
  14.         <url-pattern>/FirstServlet</url-pattern>
  15.     </servlet-mapping>
  16. </web-app>

(3)重新部署项目,刷新浏览器

结果如下

Servlet技术详解

补充:正常情况下,这时候修改FirstServlet.java里的输出内容,需要重新部署web项目(run as java文件),然后刷新浏览器,才能看到有变化。

 

2、Servlet的多重映射

Servlet多重映射指的是,同一个Servlet可以映射成几个虚拟路径(url)。也就是说,可以通过多个路径访问同一个Servlet。Servlet多重映射的实现方法有两种,具体如下

(1)配置多个<servlet-mapping>元素。如下

web.xml核心代码如下

  1. <servlet>
  2.     <servlet-name>FirstServlet</servlet-name>
  3.     <servlet-class>com.liuyanzhao.FirstServlet</servlet-class>
  4. </servlet>
  5. <servlet-mapping>
  6.     <!-- 映射为 FirstServlet -->
  7.     <servlet-name>FirstServlet</servlet-name>
  8.     <url-pattern>/FirstServlet</url-pattern>
  9. </servlet-mapping>
  10. <servlet-mapping>
  11.     <!-- 映射为 Test01 -->
  12.     <servlet-name>FirstServlet</servlet-name>
  13.     <url-pattern>/Test01</url-pattern>
  14. </servlet-mapping>

(2)重启tomcat服务器,打开浏览器

①在浏览器输入 http://localhost:8080/ServletTest/Test01

Servlet技术详解

②在浏览器输入 http://localhost:8080/ServletTest/ServletFirst

Servlet技术详解

(2)在一个<servlet-mapping>元素下配置多个<url-pattern>子元素,具体代码如下

web.xml核心代码如下

  1. <servlet>
  2.         <servlet-name>FirstServlet</servlet-name>
  3.         <servlet-class>com.liuyanzhao.FirstServlet</servlet-class>
  4.     </servlet>
  5.     <servlet-mapping>
  6.         <!-- 映射为 FirstServlet 和 Test01 -->
  7.         <servlet-name>FirstServlet</servlet-name>
  8.         <url-pattern>/FirstServlet</url-pattern>
  9.         <url-pattern>/Test01</url-pattern>
  10.     </servlet-mapping>

结果和(1)相同

3、设置默认Servlet

如果某个映射路径是 政协刚(/),那么这个Servlet就是当前Web应用的默认Servlet。也就是说,如果Servlet服务器在接受到访问请求时,如果在web.xml文件中找不到匹配的<Servlet-mapping>元素的URL,就会将访问请求交给默认Servlet处理,具体如下

(1)我们在src下新建一个Default.java文件

代码如下

  1. package com.liuyanzhao;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import javax.servlet.GenericServlet;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.ServletRequest;
  7. import javax.servlet.ServletResponse;
  8. /*
  9.  * @author LiuYanzhao
  10.  */
  11. public class Default extends GenericServlet {
  12.     public void service(ServletRequest request,ServletResponse response) throws ServletException,IOException{
  13.         //得到输出流PrinterWriter对象,Servlet使用输出流来产生响应
  14.         PrintWriter out = response.getWriter();
  15.         //使用输出流对象向客户端发送字符数据
  16.         out.println("This is a Default Page");
  17.     }
  18. }

(2)然后在web.xml里加映射

  1. <servlet>
  2.     <servlet-name>Default</servlet-name>
  3.     <servlet-class>com.liuyanzhao.Default</servlet-class>
  4. </servlet>
  5. <servlet-mapping>
  6.     <!-- 映射为 /,即所有的虚拟路径(在web.xml里找不到的) -->
  7.     <servlet-name>Default</servlet-name>
  8.     <url-pattern>/</url-pattern>
  9. </servlet-mapping>

(3)重新部署tomcat,然后打开浏览器

①在地址栏输入url:http://localhost:8080/ServletTest

Servlet技术详解

显然,本来如果不设置默认Servlet,访问这个url,一定是404的

②在地址栏输入url:http://localhost:8080/ServletTest/abc

Servlet技术详解

道理和①一样

③在地址栏输入url:http://localhost:8080/ServletTest/FirstServlet

Servlet技术详解

因为只有web.xml里不存在那个路径,我们才会使用默认Servlet,因为FirstServlet这个路径是存在的,自然会使用他自己的映射。

4、ServletConfig接口

ServletConfig:代表当前Servlet在web.xml中的配置信息,例如,文件使用的编码,公司的名字等,这些信息只需要放在web.xml里一个和多个<init-param>中

  • String getServletName()  -- 获取当前Servlet在web.xml中配置的名字
  • String getInitParameter(String name) -- 获取当前Servlet指定名称的初始化参数的值
  • Enumeration getInitParameterNames()  -- 获取当前Servlet所有初始化参数的名字组成的枚举
  • ServletContext getServletContext()  -- 获取代表当前web应用的ServletContext对象

(1)在web.xml文件中为Servlet配置一些参数信息

  1. <servlet>
  2.     <servlet-name>SecondServlet</servlet-name>
  3.     <servlet-class>com.liuyanzhao.SecondServlet</servlet-class>
  4.     <init-param>
  5.         <param-name>name1</param-name>
  6.         <param-value>value1</param-value>
  7.     </init-param>
  8.     <init-param>
  9.         <param-name>encode</param-name>
  10.         <param-value>utf-8</param-value>
  11.     </init-param>
  12.     <init-param>
  13.         <param-name>author</param-name>
  14.         <param-value>LiuYanzhao</param-value>
  15.     </init-param>
  16. </servlet>

上面的参数信息很明显,<init-param>表示要设置的参数,该节点的<param-name>表示参数名称,<param-value>表示参数的值。

(2)编写 SecondServlet类,实现读取web.xml文件中的参数信息

  1. package com.liuyanzhao;
  2. import java.io.*;
  3. import java.util.Enumeration;
  4. import javax.servlet.*;
  5. import javax.servlet.http.*;
  6. /*
  7.  * @author LiuYanzhao
  8.  */
  9. public class SecondServlet extends HttpServlet {
  10.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  11.          //防止中文参数乱码
  12.          response.setContentType("text/html;charset=utf-8");
  13.          request.setCharacterEncoding("utf-8");
  14.          PrintWriter out = response.getWriter();
  15.          //拿到init方法中的ServletConfig对象 
  16.          ServletConfig config = this.getServletConfig();
  17.          // --获取当前Servlet 在web.xml中配置的名称(用的不多)
  18.           String sName = config.getServletName();
  19.           out.println("当前Servlet 在web.xml中配置的名称:"+sName+"<br/>");
  20.          // --获取当前Servlet中配置的初始化参数(只能获取一个)经常用到
  21.           String value = config.getInitParameter("name2");
  22.           out.println(value+"<br/>");
  23.          // --获取当前Servlet中配置的初始化参数(全部获取)经常用到
  24.           Enumeration enumration = config.getInitParameterNames();
  25.           while(enumration.hasMoreElements()){
  26.               String name = (String) enumration.nextElement();
  27.               String value1 = config.getInitParameter(name);
  28.               out.println(name+":"+value1+"<br/>");
  29.           }
  30.     }
  31.     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  32.         this.doGet(req, resp);
  33.     }
  34. }

(3)部署项目,打开浏览器

输入url:http://localhost:8080/ServletTest/SecondServlet

Servlet技术详解

 

5、ServletContext 接口

暂时不写了

参考这里:https://liuyanzhao.com/4867.html

 

本文地址:https://liuyanzhao.com/4847.html

 

  • 微信
  • 赶快加我聊天吧
  • weinxin
  • 博客交流群
  • 海纳百川,大家来水
  • weinxin
言曌

发表评论

:?::razz::sad::evil::!::smile::oops::grin::eek::shock::???::cool::lol::mad::twisted::roll::wink::idea::arrow::neutral::cry::mrgreen:

目前评论:1   其中:访客  1   博主  0

    • avatar 昆山装饰

      赞!