天天看点

Servlet总结

一、 Web服务器

1、Tomcat的配置

      1) 配置环境变量

         JAVA_HOME=(JDK路径)

        CATALINA_HOME=(tomcat 的绝对路径)

     2) 给 *.sh 文件加上可执行权限

             chmod u+x *.sh

    3) 启动 Tomcat

         ①运行bin目录下startup.sh/startup.bat

         ②catalina.sh run 详细的控制方式打开

    4) 测试启动是否成功

    5) 停止tomcat 服务器

         使用shutdown.sh/shutdown.bat

           附:startup.sh,shutdown.sh,shutdown.bat,startup.bat这些文件其实是一些脚本文件用来执行大量的命令,也就是大量java命令。

2、Tomcat服务器具体介绍

    1) tomcat的默认监听端口是8080,每当接受到一个连接请求,就会为其分配一个线程。

    2) Tomcat 的web应用文件夹放在webapps下。每个 web应用的文件夹下都要有WEB-INF 文件夹,

        WEB-INF文件夹下有classes, 和lib文件夹, 以及一个web.xml文件, 类文件放在classes中,jar文件可以放在lib 中。

    3) tomcat中配置了 root 缺省应用,也就是在不指定的情况下会默认

    4) 访问应用时,在端口号后加上web应用文件夹的名字

静态页面只能放在 web应用的文件夹下,不能放在WEB-INF

文件夹中的资源是受保护的,不能够通过网络访问到。

二、 Servlet的配置文件

web 服务器接受到用户发出的请求,会根据用户访问的路径,从web.xml 配置文件中查找

所需要的类,服务器会从web 应用的WEB-INF文件夹下的classes 文件夹中搜索要加载的class 文件。

web.xml 文件的配置,一个 web.xml 中可以配置多个Servlet

<?xml version="1.0" encoding="UTF-8"?>

<welcome-file-list>

      <welcome-file>index.jsp</welcome-file>

     </welcome-file-list>

         <servlet>

                <servlet-name>servlet的名字</servlet-name>

                <servlet-class>servlet类全名</servlet-class>

         </servlet>

                <servlet-name>servlet的名字1</servlet-name>

               <servlet-class>servlet类全名1</servlet-class>

         <servlet-mapping>

               <servlet-name>servlet的名字(要和servlet标签中的相同)</servlet-name>

               <url-pattern>指定servlet相对于应用目录的路径</url-pattern>

         </servlet-mapping>

        <servlet-mapping>

               <servlet-name>servlet的名字1</servlet-name>

              <url-pattern>指定servlet相对于应用目录的路径</url-pattern>

</web-app>

三、 Servlet的调用过程

  2,服务器为用户定位资源

      (1)静态资源:/a.html /a/b.html

        这里的路径是针对web应用文件夹目录,读文件并把内容发送到客户端

      (2)动态资源:解析web.xml定位Servlet类的名字

        装载类(WEB-INF/classes 或 WEB-INF/lib/*.jar)

    创建该对象的实例

          Servlet ser=(Servlet)(Class.forName("servlet类名")).newInstance();

        //自己写的Servlet一定要实现Servlet接口或者继承实现了Servlet接口的类、、/

       /ser.service(request,response);

四、 Servlet的接口

   servlet 接口中的方法

   实现Servlet 接口

import java.io.IOException;

import javax.servlet.Servlet;

import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

public class TestServlet implements Servlet {

        ServletConfig config;

        public void init(ServletConfig config) throws ServletException {

                this.config = config;

               // 这个ServletConfig对象是由服务器生成,也就是有系统提供的,通过他可以获得启动

信息。ServletConfig对象和Servlet是一一对应的。

                // 这个方法是在Servlet创建后调用的。如果要是用到ServletConfig对象是一定要为对象赋值。

         }

          public ServletConfig getServletConfig() {

                  return this.config;

          }

          public void service(ServletRequest request, ServletResponse response)

                  throws ServletException, IOException {

                // 这个方法是用来处理请求的核心方法

          public String getServletInfo() {

                   return "....";// 这个是用来写Servlet 信息的,用来写作者,以及版本信 息

           }

            public void destroy() {

                  // 这个方法是用来销毁Servlet 对象的

            }

}

HttpServlet和GenericServlet实现了Servlet接口。

HttpServlet中的service(HttpServletRequest request,HttpServletResponse response)方法是通过

service(ServletRequest request,ServletResponse response)方法的调用来实现对请求的处理。

五、 servlet的生命周期

    1、Servlet 的生命周期分为四个阶段

         ⑴创建Servlet 对象,第一次请求到来时才会创建(默认),通过服务器反射机制创建Servlet对象,

         ⑵调用Servlet 对象的init()方法,初始化Servlet 的信息,init()方法只会在创建后立即被调用一次;

         ⑶响应请求,调用service()或者是doGet(),doPost()方法来处理请求,这些方法是运行的在多线程状态下的。多次访问时的请求内容会清掉每个Servlet 在容器中只对应一个实例。

    ⑷在长时间没有被调用或者是服务器关闭时,会调用destroy()方法来销毁Servlet 对象。

2、可以通过web.xml 文件可以配置Servlet 对象的创建时间,

         <load-on-startup>数字</load-on-startup>,表示服务器启动时创建,并依照数字大小按顺

    序创建,小数字优先加载,在<Servlet></Servlet>标签中使用,只有重要的Servlet 才会是用这个设置。

3 、通过<init-param> 标签来配置初始化参数,  

<servlet>

           <init-param>

                        <param-name></param-name>

                          <param-value></param-value>

            </init-param>

</servlet>

       参数将封装到ServletConfig对象中getInitParameter(String name)方法来得到参当没有要取的参数时会返回null。

六、 Get请求和Post请求

  先进Service(),Service决定进get还是post

  Servlet接口的实现类中的service()方法,在继承HttpServlet类时,如果没有覆盖父类的service()方那 么父类的service()方法会根据请求类型不同的会分别调用覆盖的doGet(),doPost()方法;

 如果响应两种请求的动作相同, 那么可以直接覆盖service()方法。 如果覆盖了doGet(),doPost()方法  之一,那么就会只对一种请求作出响应。在浏览器的地址栏操作按回车键,或者是热连接,都是get请求,form的method属性如果不指定,默认为get请求。get请求,会将参数显示在浏览器的地址栏上,其显示格式,在地址之后会以问号开始,以'&'分隔参数。可以通过 HttpServletRequest 对象的 getQueryString()方法来获得 get 请求的参数值。

七、 ServletRequest

  getInputStream()方法

       可以获得一个由Socket得来的输入流,可以使用这个流来实现文件的上传。type=”file”。

  getReader()方法

        可以直接获取 post 请求的参数。

  getParameter(String name)方法,

       读取请求中传送的值,可以获得form表单中指定名字的参数,多参数同名时,只取一个。

  getParameterNames(),

       取得所有参数的名字,可以获得一个迭代器Enumeration,通过这个迭代器,来获得form表单中参数的名字。

   getParameterValues(String name)

       获得指定的所有同名参数的值。注:不存在时,会返回null。做项目常用到的:

   getParameter(String name )

   getParameterValues()

  基本掌握了解:

       getQueryString()

       getReader()

       getInputstream()

       getContextPath()方法

       getContextPath()获得应用的路径,用动态获取应用路径

       getServletPath()获得Servlet路径,也就是form中的action,如果使用确切路径那么就会是这个

Servlet配置的url-pattern。

     getPathInfo()使用模糊路径匹配时会返回匹配模糊部分。

     注意:

            在form表单的action中,如果使用了扩展名匹配,一定要写明/xxxxx/xxx.xx,不要写成/xxxx/*.xx

            在form的action中要尽量使用绝对路径,也就是要用 应用名/xxx.xx或者应用名/xxx。

Servlet的url-pattern

      url-pattern可以使用以下三种方式

           1,确切路径匹配,也就是给出确定的路径 xxx/xxxx

           2,模糊路径匹配,也就是指给出一部分路径,xxxx/*,他会匹配确定路径,也就是xxxx/a 或者是 xxxx/b都是可以匹配的

           3,扩展名匹配,也就是会匹配扩展名,只要是扩展名相同就匹配,xxx.xxx *.xx

        扩展名匹配和确切路径匹配不能放在一起使用,也就是不能写成 xxxx/xxxx/xxx.xx,但是可以用*.xxx。

    setAttribute(String name,Object o)方法

          可以使用HttpServletRequest对象来携带信息。

          通过getAttribute(String name)方法来获得携带的信息。

  这两个方法类似于map 中的存取方法,setAttribute 方法给数据加上标识,getAttribute方法则是通过这个标识来获取数据,可以使用这一对方法的前提就是要保证是同一个请求对象(HttpServletRequest)

八、 ServletContext

     ServletContext对象是Servlet的上下文对象,这个对象是在服务器启动时创建的,他可以看作是一个应用的对象,他可以看作是包含Servlet,管理Servlet的对象。在每个Servlet中都会有一个ServletContext的引用,这个ServletContext是一个全局的对象,每个应用中只有一个ServletContext对象。HttpServlet中的getServletContext()方法,获得ServletContext对象。ServletContext 相当于JSP中的 Application。

九、 ServletConfig

     这个ServletConfig对象是由服务器生成,也就是有系统提供的,通过他可以获得启动信息。

ServletConfig对象和Servlet是一一对应的。这个方法是在Servlet创建后调用的。如果要是用ServletConfig对象是一定要为对象赋值。参数将封装到ServletConfig对象中。用getInitParameter(String name)方法来得到参数,当没有要取的参数时,会返回null。

         init( ServletConfig config ){

                 super.init(config); //必须将ServletConfig传递给父类,防止丢失

没有必要在init方法中去调用super.init(config),可以直接覆盖 HttpServlet中init()方法。init()这个方法它将会被 GenericServlet.init(ServletConfig config)调用,默认的系统会将ServletConfig 保存起来,此时可以通过 getServletConfig()得到ServletConfig对象。

十、 Servlet的资源访问

     Servlet的资源访问

       在Servlet中可以访问,JDBC,RMI(远程方法调用),以及跨语言平台的组件等资源。在Servlet中是用JDBC很容易,也就是在Servlet中调用JDBC中的方法,就可以实现对数据库的访问。如果在Servlet中要使用到其他的资源,例如连接数据库的驱动,可以放在tomcat服务器的文件夹下的common/lib下,这个目录中存放的是一些在服务器启动时就会加载的公共资源,一般在需要在应用中是用特定的资源,也就是jar文件,那么不要放在common/lib下,如果common/lib下的jar文件过多会导致服务器启动缓慢,应用中使用到的jar文件要放在WEB-INF/lib下,就可以被服务器找到了。如果要在 Servlet中是用 Hibernate的访问数据库的方法,那么就需要把 hibernate 需要的 jar文件,放到 WEB-INF/lib 下就可以了,Xxxxxx.hbm.xml 还是和实体类放在一起。hibernate.cgf.xml文件,要放在 WEB-INF/classes 下就可以了。

十一、 Servlet 过滤器(Filter)

    应用:Sessioin logging encoding

    过滤器是用于过滤Servlet 的请求和响应,过滤器是存在于请求和被请求资源之间的。过滤器就像当于一个中间件,请求要经过过滤器,然后过滤器才去掉用Servlet,Servlet 的响应也会被过滤器截获并作相应的处理。

     Filter 是一个接口,要写一个自己的Filter 就只能实现Filter 接口。

     Filter 也有自己的生命周期,他的生命周期和Servlet 比较相似,也是会先调用init()方法,然后再调用核心的处理

     过滤的方法doFilter(),这个方法中可定义了过滤规则,然后是destory()方法销毁Filter 对象。

      dofilter(ServletRequest request,ServletResponse response,FilterChain chain)这个是过滤的核心方法,FilterChain 的方法doFilter(ServletRequest request, ServletResponseresponse)也就是用过滤后的请求调用资源的方法,如果不写这个方法,也就算不会去调用相应的资源。

Filter 的配置

Filter 的配置和Servlet 相似。

<filter>

<filter-name>SessionFilter</filter-name>

<filter-class>alan.filter.SessionFilter</filter-class>

</filter>

<filter-mapping>

<url-pattern>/protected/*</url-pattern>

<!--这里的url-pattern 就是要过滤的Servlet 的url-pattern-->

<dispatcher>request</dispatcher>

<dispatcher>forward</dispatcher>

<dispatcher>include</dispatcher>

<!--上面的三个是过滤的范围-->

</filter-mapping>

十二、 会话

会话是可以保存状态的

Session(会话)和Cookie (会话跟踪机制)

Session 对象用来解决客户端发送多个请求时来用户请求信息的存储问题,但是他和

ServletRequest 对象是不同的, 他会在有需要时创建, 但是他的生命周期会比请求对象要长。

Session 对象的生命周期也是有限制的, 如果长时间的没有访问,就会销毁掉Session 对象,

可以通过Session 对象的setAttribute(String name, Object o) 和getAttribute(String name)来存

取数据信息。Session 是用户级的对象。

     public void service(ServletRequest request,ServletResponse response){

             String user = request.getParameter("user");

             String pass = request.getParameter("pass");

             HttpSession session = request.getSession(true);//使用请求对象来创建Session

             session.setAttribute("username", user);

             session.setAttribute("passwd", pass);

    }

getSession(true)就表示如果Session 不存在就创建一个新的Session,并把Session 的标识

SessionID 写到Cookie 中,如果存在就是用这个Session。 getSession(false)就是在Session 不存在时不会创建新Session 而是返回null。如果使用getSession()方法,就等同于getSession(true)。

注意:ServletRequest 对象适用于传输大量的数据,因为其生命周期比较短可以有效的节省内存资源。

大数据量的传输或保存不适合使用Session 空间。

Cookie,是记录用户的Session 信息,也可以记录用户的请求信息,也就是SessionID,来分辨哪一个用户是否登陆过。在每次登陆时,还会将Cookie 发送回服务器端,Cookie 是用来跟踪Session 的。

       public void service(ServletRequest request,ServletResponse response){

               String user = request.getParameter("user");

               String pass = request.getParameter("pass");

               Cookie userCookie = new Cookie("user", user);

               userCookie.setMaxAge(60 * 60 * 24 * 365);//设置Cookie 的最大有效期,秒为单位

              Cookie passCookie = new Cookie("pass", pass);

               passCookie.setMaxAge(60 * 60 * 24 * 365);

               response.addCookie(userCookie);

              response.addCookie(passCookie);

Session 是基于Cookie 来跟踪的,即:没有Cookies 的支持,Session 是不能运行起来的。

Session 对象的生命周期也是有限制的, 如果长时间的没有访问,就会销毁掉Session 对象,可以通过Session 对象的setAttribute(String name, Object o) 和getAttribute(String name)来存取数据信息。Session 是用户级的对象。

Session 是存在于服务器内存中的,用于存用户多个请求的信息的;同时也要求客户端发送

个Session 的标志:SessionID (地址栏或封装在请求的Heade r 中)。

SessionID 写到Cookie 中,如果存在就是用这个Session。getSession(false)就是在Session 不

存在时不会创建新Session 而是返回null。如果使用getSession()方法,就等同于getSession(true)。

注意:ServletRequest 对象适用于传输大量的数据,因为其生命周期比较短,可以有效的节省内存资源。

用户身份认证登录时,创建session

访问资源页面时,先判断session 是否存在

退出时清除session:session. invalidate(),接着可以将用户引导到登录页面

IE 中一个窗口代表一个会话,Mozilla firefox 不一样

多个窗口可通过Cookies 来识别Seesion。

Sssion 第二种跟踪机制:URLRewriting

Response.sendRediret(Response.encodeRedirectURL(/serv-app/student/ctrl“))

把在地址栏后加上SessionID 地址地址参数

out.println(”<a href=”+response.encodeURL(url)”

<form actioin=”response.encodeURL(url)”>

Forward 也是encodeURL

特殊一个:Response.sendRedirect(response.encodeRedirectURL(url));

每一个URL 都要加上sessionID,但它不能跨越静态页面。

所以一般默认针对Cookies 可用编写程序。

    1、session.invalidate() --- session 被立即销毁

session.setMaxInactiveInterval(int interval) --- 设置最大的超时时间,以秒为单位

    2、会话的空间不是系统自动创建的,是程序创建的

request.getSession(false); 判断请求中是否存在session,以确保服务中资源的保护

Session 跟踪机制

    1、cookie 机制

    2、URL 回写机制:把sessionid 绑定在地址栏中

             response.sendRedirect(response.encodeRedirectURL(url));

本文转自 646676684 51CTO博客,原文链接:http://blog.51cto.com/2402766/514497,如需转载请自行联系原作者