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) 测试启动是否成功
          http://localhost:8080/或http://127.0.0.1:8080/
    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应用文件夹的名字
http://localhost:8080/xxxxx/xxxx.html,
静态页面只能放在 web应用的文件夹下,不能放在WEB-INF
文件夹中的资源是受保护的,不能够通过网络访问到。
二、 Servlet的配置文件
web 服务器接受到用户发出的请求,会根据用户访问的路径,从web.xml 配置文件中查找
所需要的类,服务器会从web 应用的WEB-INF文件夹下的classes 文件夹中搜索要加载的class 文件。
web.xml 文件的配置,一个 web.xml 中可以配置多个Servlet

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<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>
                <servlet-name>servlet的名字1</servlet-name>
               <servlet-class>servlet类全名1</servlet-class>
         </servlet>
         <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>
         </servlet-mapping>
</web-app>
三、 Servlet的调用过程
  1,用户通过浏览器向web服务器发送请求  http://serverip:port/apppath
  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>
<filter-name>SessionFilter</filter-name>
<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 对象用来解决客户端发送多个请求时来用户请求信息的存储问题,但是他和
ServletRequest 对象是不同的, 他会在有需要时创建, 但是他的生命周期会比请求对象要长。
Session 对象的生命周期也是有限制的, 如果长时间的没有访问,就会销毁掉Session 对象,可以通过Session 对象的setAttribute(String name, Object o) 和getAttribute(String name)来存取数据信息。Session 是用户级的对象。
Session 是存在于服务器内存中的,用于存用户多个请求的信息的;同时也要求客户端发送
个Session 的标志:SessionID (地址栏或封装在请求的Heade r 中)。
getSession(true)就表示如果Session 不存在就创建一个新的Session,并把Session 的标识
SessionID 写到Cookie 中,如果存在就是用这个Session。getSession(false)就是在Session 不
存在时不会创建新Session 而是返回null。如果使用getSession()方法,就等同于getSession(true)。
注意:ServletRequest 对象适用于传输大量的数据,因为其生命周期比较短,可以有效的节省内存资源。
大数据量的传输或保存不适合使用Session 空间。
用户身份认证登录时,创建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));

这篇博文是我们老师给的一篇文档,感觉总结的很全,再次分享给大家,我们老师的博客:http://blog.sina.com.cn/javaprogramming

你可能感兴趣的:(servlet,职场,休闲,Servlet总结,Servlet笔记)