ServletJsp(基础二)

3. Servlet

3.1 Servlet简介

Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。

狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。

3.2 初始化一个Servlet

	package com.shangguan.servlet;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

/**
 * @ClassName: HelloWorldServlet
 * @Description:
 * @Author: 一尘
 * @Date: 2020 年 08 月 31 10:36
 * @Version 1.0
 */
public class HelloWorldServlet implements Servlet {
    //初始化
    /*   1.HelloWorldServlet 是什么? 类
    * 对于一个类我们之前是怎么用的?  new  类 创建对象  通过对象调用方法
    * 对于HelloWorldServlet你new了没?
    * 没new 没有对象  没对象那service方法怎么执行的?
    *
    *初始化是干什么?
    * 请求第一次来的时候创建servlet对象 ,容器会创建很多的对象作为参数传入我们的servlet中提供给我们使用
    * IOC思想 控制反转
    *
    *
    * */
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println(servletConfig);
        //org.apache.catalina.core.StandardWrapperFacade@52294039
        System.out.println("---servlet init----");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("----service-----");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("------destroy-----");
    }
}

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
</head>
<body>
        <h3>Welcome to index page!!</h3>
        <hr>
        <a href="helloWorldServlet">HelloWorldServlet</a>
</body>
</html>

3.3 Servlet配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
          http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
        <servlet>
            <servlet-name>helloWorld</servlet-name>
            <servlet-class>com.shangguan.servlet.HelloWorldServlet</servlet-class>
        </servlet>
    <servlet-mapping>
        <servlet-name>helloWorld</servlet-name>
        <!--路径匹配-->
        <!--唯一匹配-->
        <!--/代表的web应用-->
        <url-pattern>/helloWorldServlet</url-pattern>
        <!--* 代表所有-->
        <!--<url-pattern>/*</url-pattern>-->
        <!--多级路由匹配-->
      <!--<url-pattern>/user/add</url-pattern>
      <url-pattern>/user/del</url-pattern>-->

    </servlet-mapping>
</web-app>

3.4 Servlet生命周期

  1. The servlet is constructed, then initialized with the init method.构造servlet,然后init方法初始化。
  2. Any calls from clients to the service method are handled.处理客户端对service方法的任何调用。
  3. The servlet is taken out of service, then destroyed with the destroy method, then garbage collected and finalized. Servlet从服务中取出,然后destory方法清除,接着垃圾收集和终止。

在这里插入图片描述

init分析

1.HelloWorldServlet 是什么? 类

* 对于一个类我们之前是怎么用的?  new  类 创建对象  通过对象调用方法
* 对于HelloWorldServlet  你new了没?
* 没new 没有对象  没对象那service方法怎么执行的?
  • 初始化是干什么?

    • 请求第一次来的时候创建servlet对象 ,容器会创建很多的对象作为参数传入我们的servlet中提供给我们使用

    • IOC思想 控制反转

3.4.2 Tomcat打包执行项目原理

在这里插入图片描述

3.5 GenericServlet

GenericServlet是与协议无关,对Servlet接口的扩展

有一个子类是HttpServlet,是与Http协议相关的,也是我们现在开发所需要的。

3.6 HttpServlet

There’s almost no reason to override the service method.
service handles standard HTTP requests by dispatching them to the
handler methods for each HTTP request type (the doXXX
methods listed above).

没必要重写service方法 重写请求方式对应的doxxx方法就可以了。

修改静态资源无需重启服务器,修改了java文件或者添加了java文件必须重启服务器。

  • init()
  • destroy()
  • getInitParameter() 获取初始化参数
  • getInitParameterNames() 获取所有初始化的参数名称
  • getServletContext() 获取web应用的上下文环境
  • getServletConfig() 获取当前的servlet配置参数
  • getServletInfo()
  • getServletNames()
package com.shangguan.servlet;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

/**
 * @ClassName: FirstServlet
 * @Description:
 * @Author: 一尘
 * @Date: 2020 年 08 月 31 14:38
 * @Version 1.0
 */
public class FirstServlet extends HttpServlet {
  /*  @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        System.out.println("------service--------");
    }*/

    @Override
    public void destroy() {
        System.out.println("------------destroy-------------");
    }

    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("---------------init-----------");
    }
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.shangguan.servlet.FirstServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/first</url-pattern>
    </servlet-mapping>
</web-app>

SecondServlet.java


web.xml

3.6.1 ServletContext

web应用的上下文环境。所谓的上下文环境就是说webapplication 在servletcontainer中的环境,

获取容器中的信息。(tomcat默认的信息,tomcat解析到的信息).

  • getAttribute()
  • getAttributeNames()
  • getConetxt()
  • getInitParameter()
  • getInitParameterNames()
  • getMajorVersion()
  • getMimeType()
  • getNamedDispatcher()
  • getRealPath()
  • getRequestDispatcher()
  • getResourceAsStream()
  • getServletInfo()
  • getServletContectName()
  • removeAttribute()
  • setAttribute()
     <!--上下文的数据应该被所有的servlet所共享-->
    <context-param>
        <param-name>encoding</param-name>
        <param-value>utf-8</param-value>
    </context-param>

SecondServlet.java

package com.shangguan.servlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;

/**
 * @ClassName: SecondServlet
 * @Description:
 * @Author: 一尘
 * @Date: 2020 年 08 月 31 14:48
 * @Version 1.0
 */
public class SecondServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
             /*初始化参数*/
        System.out.println(this.getInitParameter("encoding"));
        /*枚举*/
        Enumeration<String> initParameterNames = this.getInitParameterNames();
        while(initParameterNames.hasMoreElements()){
            String name = initParameterNames.nextElement();
            String value = this.getInitParameter(name);
            System.out.println(name + "-----"+ value);
        }
        //获取上下文环境
        ServletContext servletContext = this.getServletContext();
        //org.apache.catalina.core.ApplicationContextFacade@729d8d05
        System.out.println(servletContext);
        //上下文共享的初始化的数据
        System.out.println("second---"+servletContext.getInitParameter("encoding"));
        //  返回servlet版本
        System.out.println(servletContext.getMajorVersion());  //4
        //获取文件或者文件夹的真实路径(服务器路径)
        System.out.println(servletContext.getRealPath("upload"));
       //页面的跳转        请求分发器
        /*
        * 页面跳转只发送一次请求
        * */
       // servletContext.getRequestDispatcher("/show.html").forward(req,resp);

        System.out.println(servletContext.getServletContextName());   //null
        System.out.println(servletContext.getServerInfo()); //Apache Tomcat/9.0.37

        //setAttribute();       域对象
        servletContext.setAttribute("count",10000);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doGet(req,resp);
    }
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
        <!--上下文的数据应该被所有的servlet所共享-->
    <context-param>
        <param-name>encoding</param-name>
        <param-value>utf-8</param-value>
    </context-param>
    
    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.shangguan.servlet.FirstServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/first</url-pattern>
    </servlet-mapping>
    
    
    <servlet>
        <servlet-name>second</servlet-name>
        <servlet-class>com.shangguan.servlet.SecondServlet</servlet-class>
           <init-param>
               <param-name>encoding</param-name>
               <param-value>utf8</param-value>
           </init-param>
        <init-param>
            <param-name>address</param-name>
            <param-value>西安市</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>second</servlet-name>
        <url-pattern>/second</url-pattern>
    </servlet-mapping>
</web-app>

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
</head>
<body>
    <h3>Welcome index page !!</h3>
    <a href="first">FirstServlet</a>
    <hr>
    <a href="second">SecondServlet</a>
</body>
</html>

show.index

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>show</title>
</head>
<body>
      <h4>show somethings!!!!!</h4>
</body>
</html>
utf8
address-----西安市
encoding-----utf8
org.apache.catalina.core.ApplicationContextFacade@157026b4
second---utf-8
4
C:\Users\chanh\InteliJIdeaWorkSpace\shangguan05\HelloHttpServlet\out\artifacts\HelloHttpServlet_war_exploded\upload
null
Apache Tomcat/9.0.37
---------------init-----------
firstutf-8
10000
3.6.2 ServletConfig

当前的Servlet的初始化参数的配置对象。配置的数据被当前的servlet所独享。

    <servlet>
        <servlet-name>second</servlet-name>
        <servlet-class>com.shangguan.servlet.SecondServlet</servlet-class>
           <init-param>
               <param-name>encoding</param-name>
               <param-value>utf8</param-value>
           </init-param>
        <init-param>
            <param-name>address</param-name>
            <param-value>西安市</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>second</servlet-name>
        <url-pattern>/second</url-pattern>
    </servlet-mapping>

注解方式

@WebServlet(urlPatterns = "/first",
        loadOnStartup = 1 ,`
        initParams = {
                @WebInitParam(name="encoding",value = "UTF-8")
        }
)
//initParam
public class FirstServlet extends HttpServlet {

}
3.6.3 HttpServletRequest

获取的是http请求的信息:(浏览器发送到服务器的信息,还有服务器的一些信息)

  • getContextPath()
  • getHeader()
  • getHeaderNames()
  • getMethod()
  • getCookies()
  • getQueryString()
  • getRemoteUser()
  • getReuqestSessionId()
  • getRequestURL()
  • getREquestURI()
  • getServletPath()
  • getSession()
  • getAttribute()
  • getAttributeNames()
  • getCharacterEncoding()
  • getContentLength()
  • getContentType()
  • getInputStream()
  • getLocalAddr()
  • getLocal()
  • getLocalName()
  • getLocalPort()
  • getParameter()
  • getParameterNames()
  • getRequestDispatcher()
  • getScheme()
  • getServerName()
  • getServePort()
  • removeAttribute()
  • setAttribute()
  • setCharacterEncoding()
package com.shangguan.servlet;

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

@WebServlet(name = "SecondServlet",urlPatterns = "/secondServlet")
public class SecondServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //org.apache.catalina.connector.RequestFacade@2f40bac6
        System.out.println(request);
        //org.apache.catalina.connector.ResponseFacade@2187515e
        System.out.println(response);
        System.out.println("-----------------------------------");
        //   /servlet_day02_war_exploded
        System.out.println(request.getContextPath());
        //获取头信息
        System.out.println(request.getHeader("Connection"));  //keep-alive
        System.out.println("--------------------------------");
        Enumeration<String> headerNames = request.getHeaderNames();
        while(headerNames.hasMoreElements()){
            String name = headerNames.nextElement();
            System.out.println(request.getHeader(name));
        }
        //请求方式
        System.out.println("method-----"+request.getMethod());
        System.out.println(request.getPathInfo());
        //  name=%27%E5%BC%A0%E4%B8%89%27&age=99
        System.out.println(request.getQueryString());
        //session  会话
        System.out.println(request.getRequestedSessionId());
        //URL路径          绝对路径
        System.out.println(request.getRequestURL());
        ///servlet_day02_war_exploded/secondServlet     资源路径
        System.out.println(request.getRequestURI());
        //  /secondServlet
        System.out.println(request.getServletPath());
        System.out.println("继承子servletRequest的方法");
        System.out.println(request.getContentType());
        request.setCharacterEncoding("utf8");
        System.out.println(request.getCharacterEncoding());
        System.out.println("获取服务器相关信息");
        System.out.println(request.getScheme()); //http
        System.out.println(request.getServerName());//主机 localhost
        System.out.println(request.getServerPort());//端口 8080
       // request 是域对象
       request.setAttribute("name","张无忌");
        System.out.println("-------------接受参数-------------");
        /*页面传入的所有数据到后台都是字符串
        * */
        String name = request.getParameter("name");
        String age = request.getParameter("age");
        System.out.println(name + "-----------"+ age);
        System.out.println(request.getContentLength());
       //页面跳转
       request.getRequestDispatcher("/show.jsp").forward(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
            doPost(request,response);
    }
}
6.4 HttpServletResponse
  • setCharacterEncoding()
  • setContent()
  • setHeader()
  • addCookie()
  • addHeader()
  • containsHeader()
  • sendRedirect()
  • getBufferSize()
  • getCharacterEncoding()
  • getWriter()
  • getOutputStream()
  • reset()
  • setBufferSize()
  • setContentLength()
package com.shangguan.servlet;

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

@WebServlet(name = "ThreeServlet",urlPatterns = "/threeServlet")
public class ThreeServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //设置内容的类型    post请求的乱码
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        response.setCharacterEncoding("utf-8");
        System.out.println(response.getHeader("Cookies")); //null
        Collection<String> headerNames = response.getHeaderNames();
        for (String headerName : headerNames) {
            System.out.println(response.getHeader(headerName));
        }
        //设置响应的头信息
        response.setHeader("JSESSIONID","Hello WorldResponse");
        System.out.println(response.getStatus());  //200
        System.out.println("-----------------------------------------");
       /* PrintWriter writer = response.getWriter();
            writer.println("Hello World  HttpServletResponse");
            writer.println("<h3>Response Object</h3>");
            writer.println("<h3>Response Object</h3>");
            writer.println("<h3>Response Object</h3>");
            writer.println("<h3>Response Object</h3>");
            writer.println("<h3>Response Object</h3>");
            writer.println("<h3>Response Object</h3>");
           //response主要响应异步的信息     io流
        //响应的缓冲区  向页面响应内容的时候 先向缓冲区存放内容,存满了在区页面展示。
        System.out.println(response.getBufferSize());   //8kb
         response.flushBuffer();*/
        ServletOutputStream outputStream = response.getOutputStream();
          outputStream.write("Hello Wolrd".getBytes());
          outputStream.write("<h3>你好啊中国</h3>".getBytes());
        System.out.println(response.getBufferSize());
    }

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

Reponse响应异步请求处理的结果:

  • 使用json进行前后端的数据交互
  • 对结果使用对象进行封装(AjaxResult类似的工具类)
  • Json数据转换
    • 原生的json转换(太麻烦了)
package com.shangguan.servlet;

import com.google.gson.Gson;

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

@WebServlet(name = "AjaxServlet",urlPatterns = "/ajax")
public class AjaxServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //处理乱码
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        //接受参数
        String name = request.getParameter("name");
        String email = request.getParameter("email");
        System.out.println(name+"---------"+email);
        PrintWriter writer = response.getWriter();
        AjaxResult  result = new AjaxResult();
        if(name==null || name .equals("")){
          //writer.print("用户名不能为空");
        // json        {success:true,message:'用户名不能为空'}
          //  jsonString="{\"user\":{\"id\":\"123\",\"name\":\"JSONServlet\",\"say\":\"Hello , i am a servlet !\",\"password\":\"JSON\"},\"success\":true}";
            result.setSuccess(true);
            result.setMessage("用户明不能为空!");
            //JsonObject
            //FastJson
            Gson  gson = new Gson();
            String s = gson.toJson(result);
            writer.print(s);
        }
    }

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

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ajax</title>
    <script src="js/jquery-3.0.0.min.js"></script>
</head>
<body>
<form >
    <input type="text" name="username" id="username"><br>
    <input type="text" name="email" id="email"><br>
    <input type="button" value="提交">
    <span></span>
</form>
<script>
    $(function () {
      $("[type='button']").click(function () {
           let name = $("#username").val();
           let email = $("#email").val();
           $.post("ajax",{"name":name,"email":email},function (result) {
               console.log(result)
               let data = JSON.parse(result);
               console.log(data)
               if(data.success){
                   $("span").html("<h3 style='color: red'>"+data.message+"</h3>") ;
               }
           })
      })
    })
</script>
</body>
</html>

页面重定向: sendRedirect()

重定向是我们向服务器发送请求,服务器说不是跳转,自己不能到达目标页面。我们servlet在重新发送请求,请求目标页面。

  • 发送两次请求
  • URL路径发生改变。
  • 登陆注册必须使用重定向
package com.shangguan.servlet;

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

@WebServlet(name = "FirstServlet",urlPatterns = "/first")
public class FirstServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
            //页面跳转
            request.setAttribute("list","list data informations!");
            //request.getRequestDispatcher("/show.jsp").forward(request,response);
            //页面重定向
             response.sendRedirect("show.jsp");
    }

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

.7 Session和Cookie

会话的概念:

会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。
  有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学曾经来过,这称之为有状态会话。

保存会话数据的两种技术

  • Cookie

Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。

  • Session

Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务

3.7.1 cookie

cookie细节:

  1. 一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
  2. 一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
  3. 浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
  4. 如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。
3.7.2 session

在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。

Session和Cookie的主要区别

  • Cookie是把用户的数据写给用户的浏览器。
  • Session技术把用户的数据写到用户独占的session中。
  • Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象

LoginServlet.java

package com.shangguan.servlet;

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

@WebServlet(name = "LoginServlet",urlPatterns = "/login")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
             String username = request.getParameter("username");
             String password = request.getParameter("password");
             //全局域对象
             //request.getServletContext().setAttribute("username",username);
            //会话域对象
        HttpSession session = request.getSession();
            session.setAttribute("username",username);

        Cookie cookie = new Cookie("username",username);
                    cookie.setVersion(1);
                    cookie.setMaxAge(60*60*24); //cookie的有效时间
                    response.addCookie(cookie);
             response.sendRedirect("show.jsp");
    }

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

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
</head>
<body>
    <a href="first">HttpServletResponse 重定向</a>
    <form action="login" method="post">
        <input type="text" name="username" id="username"> <br>
        <input type="password" name="password" id="password"> <br>
        <input type="submit" value="登陆">
    </form>

</body>
</html>

show.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>show</title>
</head>
<body>
    欢迎${username}登陆!
     <a href="logout">退出</a>
    <hr>
       ${list}
</body>
</html>

info.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
      ${username}
</body>
</html>

在这里插入图片描述

服务器默认的session失效时间:
在这里插入图片描述

3.8 Servlet分页

3.9 Servlet验证码

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

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.shangguan.business</groupId>
  <artifactId>servlet-validate-img</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>servlet-validate-img Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.github.penggle/kaptcha -->
    <dependency>
      <groupId>com.github.penggle</groupId>
      <artifactId>kaptcha</artifactId>
      <version>2.3.2</version>
    </dependency>

  </dependencies>

  <build>
    <finalName>servlet-validate-img</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  version="4.0">
  <display-name>Archetype Created Web Application</display-name>
    <servlet>
      <servlet-name>kapatcha</servlet-name>
      <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
      <!-- 验证码各项配置 -->
      <init-param>
        <param-name>kaptcha.border</param-name>
        <param-value>no</param-value>
      </init-param>
      <init-param>
        <param-name>kaptcha.textproducer.font.color</param-name>
        <param-value>red</param-value>
      </init-param>
      <init-param>
        <param-name>kaptcha.textproducer.char.space</param-name>
        <param-value>3</param-value>
      </init-param>
    </servlet>
  <servlet-mapping>
    <servlet-name>kapatcha</servlet-name>
    <url-pattern>/code</url-pattern>
  </servlet-mapping>
</web-app>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>index</title>
</head>
<body>
    <h2>Hello World!</h2>
    <img src="code" alt="" id="yzm"> <a href="javascript:;" onclick="changeImage()">刷新一下</a>
    <br>
    <input type="text" name="yzmcode" id="yzmcode">
    <script>
        function changeImage () {
            document.getElementById("yzm").setAttribute("src","code?\"+new Date().getTime()") ;
        }
    </script>
</body>
</html>

package com.shangguan.servlet;

import com.google.code.kaptcha.Constants;

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

/**
 * @ClassName: LoginServlet
 * @Description:
 * @Author: 一尘
 * @Date: 2020 年 09 月 02 16:32
 * @Version 1.0
 */
@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        HttpSession session = req.getSession();
        //从session中获取
        String sessionValue = (String)  session.getAttribute(Constants.KAPTCHA_SESSION_KEY);
        String yzmcode = req.getParameter("yzmcode");

        if(sessionValue.equals(yzmcode)){

        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doGet(req,resp);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值