servlet

Posted lldsgj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了servlet相关的知识,希望对你有一定的参考价值。

1 Servlet执行过程

1.1 servlet简介

servlet: 用java语言开发网页动态资源的技术。

servlet特点:

1)servlet就是一个普通的java类,继承HttpServlet类

2)一个普通的java类实现了Servlet接口,也叫Servlet程序。我们通常继承HttpServlet是为了创建一个基于http协议的servlet程序。

3)servlet程序交给tomcat服务器运行!!!

1.2 Servlet开发过程

1)编写java类,继承HttpServlet

2)servlet程序交给tomcat服务器运行

A 把servlet的class字节码拷贝到WEB-INF/classes目录下

B 在web.xml文件中配置

1.3 Servlet的执行过程

前提: tomcat服务器启动时,会加载%conf%/web.xml文件。然后再加载站点下的每个web应用的web.xml文件。

浏览器输入: http://localhost:8080/day8/first

 

http://       http协议

1)本地hosts文件查询域名和ip的映射

2)找不到,联网到运营商的DNS服务器找域名和ip的映射

8080       端口     tomcat:8080

/day8     站点下的web应用名称

/first     资源名称。截取到/first 字符串

1)在day8应用下的web.xml文件中查找是否存在匹配的url-pattern

2)使用servlet的内部名称在web.xml文件中查找是否存在相同名称的servlet配置

3)得到对应的servlet-class内容。

通过反射构造FirstServlet对象,调用方法(doGet.......)

输出内容到浏览器,看到效果!!!

2 Servlet的路径映射

url-pattern: 表示servlet的路径映射,也叫servlet访问名称。

url-patttern            浏览器输入URL

精确匹配    

     /demo1     http://localhost:8080/day8/demo1       

     /test/demo1     http://localhost:8080/day8/test/demo1

模糊匹配    

     /*        http://localhost:8080/day8/任意路径  

     /itcast/*   http://localhost:8080/day8/test/任意路径   

    *.后缀       http://localhost:8080/day8/任意路径.后缀

    (*.do   *.action  *.jsf   *.html

注意:

1)url-pattern要么以/开头,要么以*开头    例如: itcast/demo1错误写法。  

2)不能同时使用两种模糊匹配。例如: /itcast/*.html 错误写法

3)当多个url-pattern同时符合匹配规则,那么

A 精确匹配的url-pattern会优先被执行。

B 后缀名结尾的模糊匹配的url-pattern优先级最低!!!

3 Sevlet缺省路径

/  : 表示servlet的缺省路径。

tomcat服务器中配置了一个DefaultServlet,叫默认Servlet,该默认Servlet的url-pattern就是/ 。默认Servlet的作用,用于解析web应用下的静态资源。

问题: 浏览器输入一个资源名称时,查找资源的顺序是如何?

1)首先,在当前web应用下的web.xml文件中查找是否有匹配的url-pattern

2)如果匹配到,执行对应的servlet(动态资源)

3)如果没有匹配到,就交给tomcat服务器的默认Servlet去处理

4)默认Servlet会到当前web应用下读取对应名称的静态资源文件。

5)如果读到对应的静态资源文件,那么就把内容返回给浏览器

6)如果读不到对应的静态资源文件,那么就返回404的错误页面。

结论: 先找动态资源,再找静态资源!!!!

4 Servlet的生命周期(重点)

4.1 生命周期

以前:以前的程序,java类,自己去new对象,自己去使用对象调用。

现在: sevlet程序。servlet的生命周期由tomcat服务器控制的。

servlet什么时候对象创建,什么销毁,什么时候调用什么方法???

4.2 Servlet的四个生命周期

构造方法: 在创建servlet对象时调用。只调用1次。

证明servlet对象在tomcat服务器中是单实例的。

init方法:在创建完servlet对象后调用。只调用1次。

service方法: 在每次请求servlet时调用。调用n次。

destroy方法: servlet对象销毁时调用。只调用1次。tomcat服务器停止或web应用重新部署时调用

4.3 Servlet自动加载

默认情况下,第一次访问servlet时创建servlet对象。创建对象的过程中会调用构造方法和inti方法。如果init方法的业务逻辑需要消耗比较长的时间,用户的第一次访问servlet时需要等待较长的时间。

改变servlet对象创建的时机: tomcat服务器启动的时候创建servlet对象。

    <!-- 正整数:数值越大,创建对象的优先级越低 -->

    <load-on-startup>1</load-on-startup>

5 Servlet线程安全问题

servlet对象特点: 在tomcat服务器中是单实例多线程的!!!

5.1 引发Servlet多线程问题

多个线程同时操作了Servlet的成员变量(共享数据)。

5.2 避免Servlet并发问题建议

1)尽量不要在servlet类中使用成员变量。

2)如果要使用成员变量,那么就要给使用到成员变量的代码块加上代码锁,尽量缩小同步锁的范围,以避免因为同步产生代码并发执行效率降低的问题。

 

6 Init方法问题

GenericServlet中,有两个init方法。

 

有参数的init方法:该方法是servlet的四个生命周期方法中的一个。由tomcat服务器默认调用的初始化方法。在GenericServlet的实现中,该方法会调用无参数的init方法。

无参数的init方法:该方法的是Sun公司设计出来用于给开发者去覆盖,用于实现初始化逻辑的方法。

结论: 如果要编写servlet的初始化逻辑,只需要覆盖无参数的init方法即可!!!!

Servlet中重要对象:

1)HttpServletRequest对象:封装请求信息

2)HttpServletResponse对象:封装响应信息

3)ServletConfig对象: 封装一个servlet配置参数信息

4)ServletContext对象: 封装web应用环境信息

7 ServletConfig对象

7.1 ServletConfig创建

ServletConfig对象是在创建完servlet对象之后,被创建出来。然后通过有参数的init方法传递到servlet中。

ServetConfig对象主要用于加载servlet配置参数信息。

7.2 ServletConfigAPI

getInitParameter(String name)   --得到参数

getInitParameterNames()  

ServletContext getServletContext()    得到servlet上下文对象

getServletName()   得到servlet名称

<servlet>

    <servlet-name>ConfigDemo</servlet-name>

<servlet-class> ConfigDemo</servlet-class>

    <!--  配置servlet参数 -->

    <init-param>

     <param-name>path</param-name>

     <param-value>e:/bbs.txt</param-value>

    </init-param>

    <init-param>

     <param-name>BBB</param-name>

     <param-value>BBB‘s value</param-value>

    </init-param>

  </servlet>

注意: servlet的配置参数只对当前servlet有效的!!对其他servlet是无效的!!

8 ServletContext对象(重点)

8.1 ServletContext简介

ServletContext叫Servlet上下文对象,该对象表示当前的web应用环境信息。一个web应用只会创建一个ServletContext对象。

8.2 ServletContext创建时机

ServletContext对象是在tomcat服务器加载完当前web应用后创建出来。ServletContext对象是作为ServletConfig对象成员变量传入servlet中。通过ServletConfig的getServletContext()方法得到ServletContext对象。

8.3 ServletContext对象的API

得到web应用的上下文路径

getContextPath()  

得到web应用的全局参数(所有servlet有效的!!)

getInitParameter(java.lang.String name)  

getInitParameterNames()

域对象相关的方法(对比request域与context域)

setAttribute(String name, Object object)保存数据

getAttribute(String name)  得到数据

removeAttribute(String name)  清除数据

Request转发相关的

RequestDispatcher getRequestDispatcher(String path)

Response重定向

SendRedirect(string path) 

web应用读取资源文件

getRealPath(String path)

"/WEB-INF/classes/news.properties"

getResourceAsStream(String path)

 

8.4得到web应用的上下文路径

getContextPath()  得到web应用上下路径。也就是部署到tomcat服务器上运行的web应用名称。

8.5得到web应用的全局参数

getInitParameter(String name)  

getInitParameterNames()

<!-- 配置web应用全局的参数 -->

<context-param>

<param-name>AAA</param-name>

<param-value>AAA‘s value</param-value>

</context-param>

<context-param>

<param-name>BBB</param-name>

<param-value>BBB‘s value</param-value>

</context-param>

注意:

全局参数对当前web应用下的所有servlet都有效的!!!

8.6域对象相关的方法

ServetContext对象是一个域对象!!!

域对象的作用: 主要用于保存数据和获取数据,用于在web应用中不同资源之间共享数据。

Servlet1          

response.sendRedirect(context.getContextPath+"/Servlet2?name=eric");     

Servlet2

request.getParameter("name");

1)参数形式:只能传递字符串数据

2)使用域对象形式:

Servlet1中保存数据

Servlet2中获取数据

域对象相关的方法:

setAttribute(String name, Object object) 保存数据

getAttribute(String name)  得到数据

removeAttribute(String name)  清除数据

ServletContext域作用范围:

在当前的web应用中有效!!!

Servlet中所有域对象:

HttpServletRequest对象: request域

ServletContext对象: context域

HttpSession对象: session域

Jsp中域对象:

PageContext对象: page域

8.7转发相关的

getRequestDispatcher(String path)  

servlet中实现页面跳转

请求重定向: response.sendRedirect(路径);

请求转发: request.getRequestDispacher(路径).forward(request,respone);

=======请求重定向 vs  请求转发  区别====

请求重定向:

1)地址栏改变,改变为重定向到地址

2)可以重定向到当前web应用,其他web应用,甚至是其他站点资源。

3)处于两次不同的请求。不可以使用request域对象来共享数据。

请求转发:

1)地址栏不会改变。

2)只能转发到当前web应用内部资源。

3)处于同一次请求。可以使用request域对象来共享数据不同类型资源:

1)web应用内部资源。在当前web应用中的资源

2)其他web应用资源。在同一个站点下的其他web应用的资源。

3)站点外的资源。其他站点下的资源。 

 

 

自定义servlet模板

https://www.cnblogs.com/ms-grf/p/7206196.html

package ${enclosing_package};

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet(urlPatterns = { "/${primary_type_name}" })
public class ${primary_type_name} extends HttpServlet {
    
    private static final long serialVersionUID = 1L;

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=UTF-8");        
        response.getWriter().append("Served at: ");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

}

 

以上是关于servlet的主要内容,如果未能解决你的问题,请参考以下文章

servlet和filter的区别

Java基础——JSP

java---servlet与filter的联系与区别

servlet,filter,listener,intercepter区别

Tomcat根据JSP生成Servlet机制解析

servlet,过滤器,监听器,拦截器的区别