• Servlet学习笔记



    Servlet生命周期

    Servlet的生命周期可以概括为以下几个阶段:
    (1)、当支持Servlet运行的Web容器接收到客户端的请求时,会先判断用户所请求的Servlet对象是否存在。
    如果不存在,则需要加载Servlet类,创建 Servlet的对象,然后调用Servlet的init( ) 方法进行初始化。

    (2)、容器针对本次客户端请求创建 ServletRequest 和 ServletResponse 对象,并且创建一个线程,调用Servlet对象的service( )方法,,service()方法再根据客户端的请求方式间接调用 doGet() 方法或者 doPost() 方法。
    service()方法运行结束后产生响应,容器将响应发回客户端。

    (3)、当Web应用被卸载或者服务器被关闭的时候,容器会销毁为本次客户端请求创建的 ServletRequest 和 ServletResponse 对象以及相应的线程。此时会调用 destroy() 方法释放资源。

    需要注意的是,加载 Servlet 类,创建 Servlet 对象、调用初始化方法 init() 和销毁方法 destroy() 在Servlet的整个生命周期中都只有一次。

    Servlet在整个生命周期中被调用的方法

    Servlet在整个生命周期中会有一些方法被服务器自动调用,其中的主要方法有:
    init( )方法:用于初始化
    Destro( )方法:用于释放资源
    service( )方法:服务类方法,对用户的请求进行处理,并对用户进行响应,几乎所有处理功能都在这里完成。service( )方法通常会激活doGet( )或 doPost( ) 方法。
    doGet( )方法可以响应get方式的请求,doPost( ) 方法可以响应 post方式的请求。
    一般不推荐直接重写 service( )方法,而是应该重写doGet( )或者 doPost( )方法。通常,表单提交常使用post方式,超链接使用 get 方式。

    Servlet运行原理

    在这里插入图片描述

    Servlet三种实现方式

    实现Servlet的三种方式:一个实现,两个继承

    1.实现 javax.servlet.Servlet接口

    @WebServlet(urlPatterns = "/second",initParams = {@WebInitParam(name="user",value="Tom")})
    public class Second implements Servlet {
        private ServletConfig config;
        @Override
        public void destroy() {
        // TODO Auto-generated method stub
        }
        @Override
        public ServletConfig getServletConfig() {
        // TODO Auto-generated method stub
        return null;
        }
        @Override
        public String getServletInfo() {
        // TODO Auto-generated method stub
        return null;
        }
        @Override
        public void init(ServletConfig arg0) throws ServletException {
        // TODO Auto-generated method stub
           this.config=arg0;       
        }
        @Override
        public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
        // TODO Auto-generated method stub
        PrintWriter out=arg1.getWriter();    
        out.print("this is Second Servlet");
        out.print(this.config.getInitParameter("user"));
        //释放printwriter对象
        out.flush();
        out.close();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    2.继承GenericServlet类

    @WebServlet(urlPatterns = "/third")
    public class Third extends GenericServlet {
    	@Override
    	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
    		PrintWriter out=arg1.getWriter();	
    		out.print("this is Third Servlet");
    		//释放printwriter对象
    		out.flush();
    		out.close();
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3.继承HttpServlet类

    //编写一个类去继承HttpServlet抽象类重写doget( )和dopost( )方法
    public class HelloHttp extends HttpServlet{
        //处理get请求
        public void doGet(HttpServletRequest req, HttpServletResponse res){
            //业务逻辑
            try{
                PrintWriter pw = res.getWriter();
                pw.println("hello, Http");
            }
            catch (Exception e){
                e.printStackTrace();
            }
        }
        public void doPost(HttpServletRequest req, HttpServletResponse res){
            this.doGet(req,res);    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    访问Servlet的几种方式

    1、servlet直接转发到另一个servlet

    在一个servlet的 doGet() / doPOST() 方法中输入以下内容:
    目的servlet将使用doGet接收该请求,不会用doPOST方法接收。

    request.setAttribute("account", "张三");   //在请求中以属性形式设置要传送的数据
    request.getRequestDispatcher("TestServlet").forward(request, response);   
    //将请求分发到TestServlet
    
    • 1
    • 2
    • 3

    2、使用a标签跳转到servlet

    <a href=/Login>登录</a>
    
    • 1

    有/ 从服务器根目录
    没有/ 从当前上下文路径

    3、表单提交

    <form action="/myweb/Servlet1" method="post">
    	<input type="text" name="name">
    	<input type="submit" value="OK">
    </form>
    
    • 1
    • 2
    • 3
    • 4

    有/ 从服务器根目录
    没有/ 从当前上下文路径

    4、Ajax请求Servlet

    1.通过URL调用(以GET方式进行提交)

    (1)在浏览器地址栏内输入
    http://localhost:8080/servlet/TestServlet?id=1&name=zhangsan
    即可请求TestServlet并将id=1和name=zhangsan以get的方式提交上去。
    (2)可以将上面的内容作为a标签的href值。
    (3)在js中,也可以将上面的内容作为window.location.href的值。

    2.通过表单提交(以GET/POST方式进行提交)

    <form action="TestServlet" method="post">
    		账号:<input type="text" name="account" />
    		密码:<input type="password" name="pwd" />
    		<input type="submit" value="登录" />
    </form>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    通过form表单可以通过GET或POST两种方式进行提交,如果以GET方式进行提交,account和pwd的值将显示在地址栏中;以POST的方式这些值将不能显式看到。

    3.通过ajax方式提交

    在引入jquery.js后,可在< script >< /script >标签内填入以下内容:
    (1)在指定提交请求类型为get后,可以在属性url后通过方式一进行请求;也可以通过在data属性后输入键值对形式提交数据。

    $.ajax({
    		type: 'GET',
    		url: 'TestServlet',
    	//	data: {"account":account,"pwd":pwd},//上传数据
    		dataType:"JSON",//要求返回的数据格式要求
    		success: function(data,msg){//data指服务器返回的数据
    			//请求成功触发
    		},
    		error:function(xhr,errorMsg,error){
    			//请求失败触发
    		}
    	});
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    (2) 在指定提交类型为post后,只能通过在data属性后输入键值对形式提交数据。

    4.通过一个servlet请求另外一个servlet

    在一个servlet的doGet()/doPOST()方法中输入以下内容:
    目的servlet将使用doGet接收该请求,不会用doPOST方法接收。

    request.setAttribute("account", "张三");   
    //在请求中以属性形式设置要传送的数据
    request.getRequestDispatcher("TestServlet").forward(request, response);   
    //将请求分发到TestServlet
    
    • 1
    • 2
    • 3
    • 4

    配置Servlet(使用标签)

    <web-app>
        <servlet>
            <servlet-name>hello</servlet-name>
            <servlet-class>HelloWorld</servlet-class>
         </servlet>
         <servlet-mapping>
             <servlet-name>hello</servlet-name>
             <url-pattern>/hello</url-pattern>
         </servlet-mapping>
    </web-app>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    Session创建和销毁

    session什么时候被创建
    HttpServletRequest.getSession(true) 这样的语句时才会被创建。 所以没有调用getSession方法则不会创建session。

    要了解Session首先要知道一个概念:
    Session的销毁只有两种情况:
    第一:session调用了 session.invalidate()方法。
    第二:前后两次请求超出了session指定的生命周期时间。

    // 新建一个session时触发此操作  
        public void sessionCreated(HttpSessionEvent se) {   
            System.out.println(se.getSession().getId());  
        }  
      
    // 销毁一个session时触发此操作  
        public void sessionDestroyed(HttpSessionEvent se) {  
           System.out.println(se.getSession().getId()); 
        }  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    Session怎么存值

    ● Session中的数据是通过哈希表的方式进行存取的:
    ● setAttribute(String name,Object value)
    ● Object getAttribute(String name)

    //存值
    session.setAttribute(name, value);
    
    • 1
    • 2

    Cookie案例代码

    Cookie案例代码

    Cookie怎么设置有效期

    ● public void setMaxAge(int maxAge):设置Cookie的有效时间,以秒为单位
    ● maxAge如果为正数,在有效期内,用户关闭浏览器后再重新启动,Cookie仍有效
    ● maxAge如果为负数,只在当前浏览器有效,当关闭浏览器时,Cookie失效
    ● maxAge如果为0,会删除过去有效的Cookie。
    ● public int getMaxAge():获取cookie在失效以前的最大时间,以秒计算

    //有效期设为7天
    cookie.setMaxAge(60 * 60 * 24 * 7);
    
    • 1
    • 2

    Cookie写入和读取

    先写一个HTML页面,在HTML表单提交后,action = “cookie_demo1/hello”
    提交到servlet,servlet获取到表单内容,并且设置cookie给浏览器,同时跳转到注册页面2.html,
    在2.html填写相应的内容后action=“cookie_demo1/hello1”
    servlet1获取2.html中的内容并且获取到浏览器中的cookie

    //写入
    Cookie c=new Cookie("season","spring");
        c.setMaxAge(30);    //cookie的有效期为30秒
        response.addCookie(c); //将cookie写入客户端
    //读取
    Cookie[] a=request.getCookies();
        //根据设置时的cookie个数决定数组元素个数
        for( int i=0;i<a.length;i++){
         String name=(String)(a[i].getName());
          String value=(String)(a[i].getValue());
          out.println(name+:+value);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    Session和Cookie的区别

    1、Cookie可以存储在浏览器或者本地,Session只能存在服务器
    2、session能够存储任意的java对象,cookie 只能存储String 类型的对象
    3、Session比Cookie更具有安全性 (Cookie有安全隐患,通过拦截或本地文件找得到你的cookie后可以进行攻击)
    4、Session占用服务器性能,Session过多,增加服务器压力
    5、单个Cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个Cookie,Session是没有大小限制和服务器的内存大小有关。

    不同

    存放地点:cookie存放在客户端的硬盘里,属于离线存放,而session存放在服务器的内存中。

    存活时间:cookie可以长期存放在客户端,具体的存活时间由setMaxAge()方法所指定的数值决定,session随用户访问服务器而产生,随客户超时或下线而消失。

    安全性:cookie存放在客户端,可能会被别有用心的网站读取,安全性较差,而session存放在服务器的内存中,用户不能修改,且随客户端浏览器的关闭而消失,安全性较好。

    联系

    不论是cookie还是session隐含对象都需要浏览器支持cookie并且没有禁用cookie。

    Servlet三个作用域

    1、request作用域:

    针对同一次请求,一般存放提示信息
    每一次请求都是一个新的request对象,如果Web组件之间需要共享同一个请求中的数据,只能使用request作用域
    对象类型 javax.servlet.http.HttpServletRequest

    2、session作用域:

    针对同一次会话,一般存放用户信息
    每一次会话都是一个新的session对象,如果需要一个会话中的多个同一个请求之间需要共享数据,只能使用session作用域
    对象类型 javax.servlet.http.HttpSession

    3、application作用域:针对同一个web项目/web应用

    Tomcat从启动到关闭,web项目中有且仅有一个application对象,作用于整个Web应用,可以实现多个会话之间的数据共享
    对象类型 javax.servlet.ServletContext
    在这里插入图片描述

    配置Servlet(使用标签)

    配置Servlet有两种方式

    1、在 web.xml 文件中配置

    <web-app>
        <servlet>
            <servlet-name>hello</servlet-name>
            <servlet-class>HelloWorld</servlet-class>
         </servlet>
         <servlet-mapping>
             <servlet-name>hello</servlet-name>
             <url-pattern>/hello</url-pattern>
         </servlet-mapping>
    </web-app>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2、使用注解配置

    //在Servlet所在的 java 文件中使用注解
    @WebServlet("/HelloServlet")
    public class HelloServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    	public void doGet(HttpServletRequest request, HttpServletResponse response) throws 	ServletException, IOException {
    		doPost(request, response);
    		PrintWriter out = response.getWriter();
    		out.print("注解方式配置Servlet访问");
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    Servlet输出HTML、字符串、json

    输出HTML

    HTML:创建一个Servlet类,实现返回页面HTML内容:

    @WebServlet(name="PageServlet",urlPatterns = "/Servlet/PageServlet")
    public class PageServlet extends HttpServlet {
        @Override
        public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html");
            response.setCharacterEncoding("UTF-8");
            PrintWriter out = response.getWriter();
            out.println("");
            out.println("Servlet 实例");
            out.println("");
            out.println("hello world!");
            out.println("
    Servlet实例:"
    ); out.println(this.getClass()); out.println(""); out.println(""); out.flush(); out.close(); } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    输出字符串

    字符串:创建一个Servlet类,实现返回字符串

    @WebServlet(name="CharacterServlet",urlPatterns = "/Servlet/CharacterServlet")
    public class CharacterServlet extends HttpServlet {
        @Override
        public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            String result = "hello world!";
            //返回结果
            response.setContentType("text/html");
            response.setCharacterEncoding("UTF-8");
            // 获取PrintWriter对象
            PrintWriter out = response.getWriter();
            out.print(result);
            // 释放PrintWriter对象
            out.flush();
            out.close();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    输出json

    Josn:创建JsonServlet类,实现Servlet类返回JSON内容。

    @WebServlet(name="JsonServlet",urlPatterns = "/Servlet/JsonServlet")
    public class JsonServlet extends HttpServlet {
        @Override
        public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            String json = "{\n" +
                    "\t\"userId\": 1,\n" +
                    "\t\"userName\": \"hello world\",\n" +
                    "\t\"blogUrl\": \"https://cn.bing.com\",\n" +
                    "\t\"sex\": \"男\"\n" +
                    "}";
     
            //返回结果
            response.setContentType("application/json");
            response.setCharacterEncoding("UTF-8");
            // 获取PrintWriter对象
            PrintWriter out = response.getWriter();
            out.print(json);
            // 释放PrintWriter对象
            out.flush();
            out.close();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    发请求怎么传参数

    http://localhost:8080/Project/Servlet?name=Tom&age=20
    
    • 1

    请求转发

    //请求转发
    request.getRequestDispatcher("/index").forward(request, response);
    //一个请求 一个响应
    
    • 1
    • 2
    • 3

    重定向

    重定向到百度网站
    response.sendRedirect("http://www.baidu.com");
    重定向到另一个Servlet
    response.sendRedirect("Login2");
    //两个请求  两个响应
    
    response.sendRedirect("请求地址");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

  • 相关阅读:
    Redis学习笔记(四)Redis订阅发布&主从复制&哨兵模式
    【PCL自学:PCLVisualizer】点云可视化工具PCLVisualizer
    Java 字节输出流FileOutputStream的用法和概述
    CV计算机视觉每日开源代码Paper with code速览-2023.11.6
    计算机网络-计算机网络体系结构-物理层
    南京工业大学计算机考研资料汇总
    Hoops编程指南:04_3_user_interaction_window_system_interaction
    Redis——双端链表
    Unity可视化Shader工具ASE介绍——8、UI类型的特效Shader编写
    java毕业生设计校园一卡通服务平台计算机源码+系统+mysql+调试部署+lw
  • 原文地址:https://blog.csdn.net/rej177/article/details/126011061