java-servlet

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

 

Servlet 主要用于处理客户端传来的 HTTP 请求,并返回一个响应,它能够处理的请求有 doGet() 和 doPost() 等

 

Servlet 由 Servlet 容器提供,Servlet 容器是指提供了 Servlet 功能的服务器(如 Tomcat)。

Servlet 容器会将 Servlet 动态加载到服务器上,然后通过 HTTP 请求和 HTTP 应与客户端进行交互。

 

 

 

 

第一个项目:

 

 

在WEB-INF目录下新建两个文件夹,分别命名未classes和lib(classes目录用于存放编译后的class文件,lib用于存放依赖的jar包) 

 

 

 

 

 

 

 

创建一个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.io.PrintWriter;

@WebServlet(name = "Servlet")
public class Servlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<h1>hello world</h1>");
    }
}

 

配置web.xml文件,

启动一个WEB项目的时候,WEB容器会去读取它的配置文件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>Quan</servlet-name>
        <servlet-class>Servlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>Quan</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    


</web-app>

 

启动测试

 

 访问:

 

 

 

启动的时候出现下面警告(不影响编译使用)

web.WebXml.setVersion 未知版本字符串 [4.0]。将使用默认版本。

下调web-app的版本到3.0即可

 

Servlet相关的接口和类:

 

 

方法声明功能描述
void init(ServletConfig config) 容器在创建好 Servlet 对象后,就会调用此方法。该方法接收一个 ServletConfig 类型的参数,Servlet 容器通过该参数向 Servlet 传递初始化配置信息
ServletConfig getSendetConfig() 用于获取 Servlet 对象的配置信息,返回 Servlet 的 ServletConfig 对象
String getServletInfo() 返回一个字符串,其中包含关于 Servlet 的信息,如作者、版本和版权等信息
voidservice (ServletRequest request,ServletResponse response) 负责响应用户的请求,当容器接收到客户端访问 Servlet 对象的请求时,就会调用此方法。
容器会构造一个表示客户端请求信息的 ServletRequest 对象和一个用于响应客户端的 ServletResponse 对象作为参数传递给 service() 方法。
在 service() 方法中,可以通过 ServletRequest 对象得到客户端的相关信息和请求信息,在对请求进行处理后,调用 ServletResponse 对象的方法设置响应信息
void destroy() 负责释放 Servlet 对象占用的资源。当服务器关闭或者 Servlet 对象被移除时,Servlet 对象会被销毁,容器会调用此方法

 init()、service() 和 destroy() 方法可以表现 Servlet 的生命周期,它们会在某个特定的时刻被调用。

 

对于Servlet接口,本来就存在两个实现接口的类:

GenericServlet 和 HttpServlet。

其中GenericServlet 是一个部分实现的接口的类,并没有实现HTTP请求和响应

HttpServlet实现了HTTp请求和响应

通常情况下,编写的 Servlet 类都继承自 HttpServlet,在开发中使用的也是 HttpServlet 对象。

HttpServlet常用方法:

方法声明功能描述
protected void doGet (HttpServletRequest req, HttpServletResponse resp) 用于处理 GET 类型的 HTTP 请求的方法
protected void doPost(HttpServletRequest req, HttpServletResponse resp) 用于处理 POST 类型的 HTTP 请求的方法

HttpServlet 主要有两大功能,具体如下。

  1. 根据用户请求方式的不同,定义相应的 doXxx() 方法处理用户请求。例如,与 GET 请求方式对应的 doGet() 方法,与 POST 方式对应的 doPost() 方法。
  2. 通过 service() 方法将 HTTP 请求和响应分别强转为 HttpServletRequest 和 HttpServletResponse 类型的对象。


需要注意的是,由于 HttpServlet 类在重写的 service() 方法中,为每一种 HTTP 请求方式都定义了对应的 doXxx() 方法,因此,当定义的类继承 HttpServlet 后,只需要根据请求方式重写对应的 doXxx() 方法即可,而不需要重写 service() 方法。

 

 

Servlet的生命周期:

 

 

初始化阶段

当客户端向 Servlet 容器发出 HTTP 请求要求访问 Servlet 时,Servlet 容器首先会
解析请求,检查内存中是否已经有了该 Servlet 对象,如果有,则直接使用该 Servlet 对象,
如果没有,则创建 Servlet 实例对象 然后通过调用 init() 方法实现 Servlet 的初始化工作

注意:在Servlet实例对象的整个生命周期,他的init方法只调用一次

 

运行阶段

Servlet 容器会为这个请求创建代表 HTTP 请求的 ServletRequest 对象和代表 HTTP 
响应的 ServletResponse 对象,然后将它们作为参数传递给 Servlet 的 service() 方法。 service() 方法从 ServletRequest 对象中获得客户请求信息并处理该请求,通过
ServletResponse 对象生成响应结果。

注意:每一次请求到新建一对request和Repose对象,即Service方法会被多次调用

 

销毁阶段

当服务器关闭或 Web 应用被移除出容器时,Servlet 随着 Web 应用的关闭而销毁。在销毁 
Servlet 之前,Servlet 容器会调用 Servlet 的 destroy() 方法,以便让 Servlet
对象释放它所占用的资源

注意:在整个Servlet对象的生命周期中,destroy方法只能调用一次。

且一旦被创建,就会在内存等待客户端的访问,知道服务器关闭或web应用被移除容器。

 

Servlet虚拟路径的映射

一个 <servlert-mapping> 元素用于映射一个 Servlet 的对外访问路径,该路径也称为虚拟路径

<servlet-mapping>
        <servlet-name>Quan</servlet-name>
        <url-pattern>/QQ</url-pattern>
    </servlet-mapping>

创建好的 Servlet 只有映射成虚拟路径,客户端才能对其进行访问,简单来讲就是配置URL匹配规则

 

多重映射

多个路径的最终访问是同一个Servlet实例对象。

11111配置多个<servlet-mapping>标签

<servlet-mapping>
        <servlet-name>Quan</servlet-name>
        <url-pattern>/QQ</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>Quan</servlet-name>
        <url-pattern>/QQHLL</url-pattern>
    </servlet-mapping>

 

 

222222在同一个Mapping中配置多个<url-pattern>子元素

    <servlet-mapping>
        <servlet-name>Quan</servlet-name>
        <url-pattern>/QQHLL</url-pattern>
        <url-pattern>/QQHLL2</url-pattern>
    </servlet-mapping>

 

 

 

 

映射路径的通配符

<servlet-mapping>
        <servlet-name>QuanS</servlet-name>
        <!--        以.quan结尾的URL请求-->
        <url-pattern>*.quan</url-pattern>

    </servlet-mapping>

注意:<url-pattern>/*.quan</url-pattern>,这样子是错误的规则

因为这里里面含有了歧义,包括/*  或者*.quan,所以不合理

 

 

   <servlet-mapping>
        <servlet-name>QuanS</servlet-name>
        <!--        以quanall开头的所的URL请求-->
        <url-pattern>/quanall/*</url-pattern>
    </servlet-mapping>

 

 

 

总结:

当客户端访问一个 Servlet 时,如果请求的 URL 地址能够匹配多条虚拟路径,那么 Tomcat 将采取最具体匹配原则查找与请求 URL 最接近的虚拟映射路径

/abc/*  映射到 Servlet1
/*      映射到 Servlet2
/abc    映射到 Servlet3
*.do    映射到 Servlet4

解析:

当请求 URL 为 /abc/a.html,   /abc/* 和 /* 都可以匹配这个 URL,Tomcat 选择/abc/*
当请求 URL 为 /abc            /*、/abc/* 和 /abc 都可以匹配这个 URL,Tomcat 选择/abc
当请求 URL 为 /abc/a.do       /*、*.do 和 /abc/* 都可以匹配这个 URL,Tomcat 选择/abc/*
当请求 URL 为 /a.do           /* 和 *.do 都可以匹配这个 URL,Tomcat 选择*.do
当请求 URL 为 /xxx/yyy/a.do     *.do 和 /* 都可以匹配这个 URL,Tomcat 选择*.do

 

默认Servlet

是什么:

Servlet 的映射路径仅仅是一个正斜线(/),那么这个 Servlet 就是当前 Web 应用的默认 Servlet。

与nginx配置文件里面的location /差不多

接收到访问请求时,如果在 web.xml 文件中找不到匹配的 <servlet-mapping> 元素的 URL,则会将访问请求交给默认 Servlet 处理,

简单来讲就是,默认的Servlet 处理其他Servlet都不处理的访问请求

其实在Tomcat服务器里面也配置了一些相关规则,其中有一个默认规则

 

 

当 Tomcat 服务器中的某个 Web 应用没有默认 Servlet 时,都会将 default这个Servlet 作为默认的 Servlet。当客户端访问 Tomcat 服务器中的某个静态 HTML 文件时,

default这个Servlet 会判断 HTML 是否存在,如果存在,则会将数据以流的形式回送给客户端,否则会报告 404 错误。

 

 可以自己默认设置:

 <servlet>
        <servlet-name>DefaultQuan</servlet-name>
        <servlet-class>QuanServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>DefaultQuan</servlet-name>
        <!--        设置默认的servlet-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

 

 

 

这样子无论访问上面都不会报错,只会调用自定义的默认servlet

不过强烈建议使用Tomcat默认的servlet,因为你可以看到报错内容

 

 ServletConfig &&ServletContext

 ServletConfig

常用接口

 

方法说明功能描述
String getInitParameter(String name) 根据初始化参数名返回对应的初始化参数值
Enumeration getInitParameterNames() 返回一个 Enumeration 对象,其中包含了所有的初始化参数名
ServletContext getServletContext() 返回一个代表当前 Web 应用的 ServletContext 对象
String getServletName() 返回 Servlet 的名字,即 web.xml 中 <servlet-name>元素的值

运行 Servlet 程序时,可能需要一些辅助信息,例如,文件使用的编码、使用 Servlet 程序的共享信息等,这些信息可以在 web.xml 文件中使用一个或多个 <init-param> 元素进行配置。

 当 Tomcat 初始化一个 Servlet 时,会将该 Servlet 的配置信息封装到 ServletConfig 对象中,此时可以通过调用 init(ServletConfig config)方法将 ServletConfig 对象传递给 Servlet。

创建一个Servlet

@WebServlet(name = "ServletMessage")
public class ServletMessage extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doGet(request,response);//如果是post请求,那就直接调用本类的doGet方法
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter pw = response.getWriter();
//        getServletConfig 是GenericServlet这个类的方法,
//        ServletMessage extends HttpServlet
//        public abstract class HttpServlet extends GenericServlet
        ServletConfig config = this.getServletConfig();
        String param = config.getInitParameter("encoding");
        pw.println("encoding"+param);
    }
}

 

通过web.xml进行servlet相关的设置;

<!--####################################-->
    <servlet>
        <servlet-name>Config</servlet-name>
        <servlet-class>ServletMessage</servlet-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>Config</servlet-name>
        <url-pattern>/config</url-pattern>
    </servlet-mapping>

上面设置了红色部分servlet的encoding的属性,就是编码规则为UTF-8

访问的时候可以通过

ServletConfig config = this.getServletConfig();
String param = config.getInitParameter("encoding");

获取ServletConfig的配置:

 

 由此可见,ServletConfig可以在web-xml获取的参数信息

 

Servlet-Context

Tomcat 会为每个 Web 应用创建一个唯一的 ServletContext 对象代表当前的 Web 应用,该对象封装了当前 Web 应用的所有信息。可以利用该对象获取 Web 应用程序的初始化信息读取资源文件等。

 

11111获取Web应用的初始化参数

 注意这个不止是当前Servlet的参数,是整个Web应用的熟吃好参数

例子:

先设置web应用的初始化变量和值:随便设置servlet实现对象

<!--    设置整个Web应用的初始化信息-->
    <context-param>
        <param-name>yourname</param-name>
        <param-value>quan</param-value>
    </context-param>
    <context-param>
        <param-name>yourpasswd</param-name>
        <param-value>2004</param-value>
    </context-param>


<!--获取context的servlet-->
    <servlet>
        <servlet-name>context</servlet-name>
        <servlet-class>ContextServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>context</servlet-name>
        <url-pattern>/context</url-pattern>
    </servlet-mapping>

<context-param> 元素位于根元素 <web-app> 中,它的子元素 <param-name> 和 <param-value> 分别用于指定参数的名字和参数值。要想获取这些参数名和参数值的信息,可以使用 ServletContext 接口中定义的 getInitParameterNames() 和 getInitParameter(String name)方法分别获取。 

 

 

编写servlet 对象去获取servletcontext里面的变量和值:

@WebServlet(name = "ContextServlet")
public class ContextServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter pw = response.getWriter();
        ServletContext context = this.getServletContext();

        Enumeration<String> paraNames = context.getInitParameterNames();
        System.out.println(paraNames);
        while (paraNames.hasMoreElements()){
            String name = paraNames.nextElement();
            String value = context.getInitParameter(name);
            pw.println(name + "=" + value);
            pw.println("<br/>");
        }
    }
}

过 this.getServletContext() 方法获取到 ServletContext 对象后,首先调用 getInitParameterNames() 方法,获取到包含所有初始化参数名的 Enumeration 对象,

然后遍历 Enumeration 对象,根据获取到的参数名,通过 getInitParamter(String name)方法得到对应的参数值。

 

 

结果如下:

 

 

 

 

 

22222读取WEB应用下的文件

 实际开发中,有时会需要读取 Web 应用中的一些资源文件,如配置文件和日志文件等。为此,在 ServletContext 接口中定义了一些读取 Web 资源的方法,

这些方法是依靠 Servlet 容器实现的。Servlet 容器根据资源文件相对于 Web 应用的路径,返回关联资源文件的 I/O 流或资源文件在系统的绝对路径等。

 

 

方法说明功能描述
Set getResourcePaths(String path)
返回一个 Set 集合,集合中包含资源目录中子目录和文件的路径名 称。参数 path 必须以正斜线(/)开始,指定匹配资源的部分路径
String getRealPath(String path)  返回资源文件在服务器文件系统上的真实路径(文件的绝对路径)。参数 path 代表资源文件的虚拟路径,它应该以正斜线(/)开始,/ 表示当前 Web 应用的根目录,如果 Servlet 容器不能将虚拟路径转换为文 件系统的真实路径,则返回 null

URL getResource(String path)
返回映射到某个资源文件的 URL 对象。参数 path 必须以正斜线(/)开始,/ 表示当前 Web 应用的根目录
InputStream getResourceAsStream(String path) 返回映射到某个资源文件的 InputStream 输入流对象。参数 path 的传递规则和 getResource() 方法完全一致

 

编写一个Servlet

@WebServlet(name = "FileServlet")
public class FileServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter pw = response.getWriter();
        ServletContext servletContext = this.getServletContext();

        InputStream is = servletContext.getResourceAsStream("
WEB-INF/how.propertise"
);//当前web应用的相对路径
//不需要进行呼号转换
Properties properties = new Properties(); properties.load(is); pw.println(properties.getProperty("id")); } }

 

设置Servlert:

<!--获取context的servlet-->
    <servlet>
        <servlet-name>file</servlet-name>
        <servlet-class>FileServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>file</servlet-name>
        <url-pattern>/fileservlet</url-pattern>
    </servlet-mapping>

 

在WEB-INF/how.propertise"编写一个文件

访问即可

 

 

 

 

servlet处理用户请求的流程:

  Servlet 的每次请求,Web 服务器在调用 service() 方法之前,都会创建 HttpServletRequest 和 HttpServletResponse 对象。其中,HttpServletRequest 对象用于封装 HTTP 请求消息,简称 request 对象。HttpServletResponse 对象用于封装 HTTP 响应消息,简称 response 对象。

 

 

 

首先浏览器向 Web 服务器发送了一个 HTTP 请求,Web 服务器根据收到的请求,会先创建一个 HttpServletRequest 和 HttpServletResponse 对象,
然后再调用相应的 Servlet 程序。 在 Servlet 程序运行时,它首先会从 HttpServletRequest 对象中读取数据信息,然后通过 service() 方法处理请求消息,并将处理后的响应数据写入
到 HttpServletResponse 对象中。最后,Web 服务器会从 HttpServletResponse 对象中读取到响应数据,并发送给浏览器。 需要注意的是,在 Web 服务器运行阶段,每个 Servlet 都只会创建一个实例对象,针对每次 HTTP 请求,Web 服务器都会调用所请求 Servlet
实例的 service(HttpServletRequest request,HttpServletResponse response)方法,并重新创建一个 request 对象和一个 response 对象。

 

 

每次的HTTP请求到达Web服务器之后,Web服务器会同时创建HttpServletRespone 和HttpServletRequest 对象

HttpServletRequest对象会获取请求的数据,所有的消息都会疯转进去。

Web调用对应的Servlet ,Servlet通过service方法和传入的两个对象进行消息的处理。最后将相应数据写入到HttpServletRespone中去。

 

HttpServletRequest

主要作用是封装 HTTP 请求消息。由于 HTTP 请求消息分为请求行、请求消息头和请求消息体三部分。因此,在 HttpServletRequest 接口中定义了获取请求行、请求头和请求消息体的相关方法。

 

 

获取请求行的方法

 

 

@WebServlet(name = "RequestMethodServlet")
public class RequestMethodServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter pw = response.getWriter();

        pw.println("getMethod"+ "==="+ request.getMethod());
        pw.println("getRequestURI"+ "==="+ request.getRequestURI());
        pw.println("getQueryString"+ "==="+ request.getQueryString());
        pw.println("getContextPath"+ "==="+ request.getContextPath());
        pw.println("getServletPath"+ "==="+ request.getServletPath());
        pw.println("getRemoteAddr"+ "==="+ request.getRemoteAddr());
        pw.println("getRemoteHost"+ "==="+ request.getRemoteHost());
        pw.println("getRemotePort"+ "==="+ request.getRemotePort());
        pw.println("getLocaIAddr"+ "==="+ request.getLocalAddr());
        pw.println("getLocalName"+ "==="+ request.getLocalName());
        pw.println("getServerName"+ "==="+ request.getServerName());
        pw.println("gctServerPort"+ "==="+ request.getServerPort());
        pw.println("getRequestURL"+ "==="+ request.getRequestURL());

    }
}

 

结果:

 

 

 

获取请求头的方法

 

 

 

 

 

获取请求参数

通过表单进行参数传递

 

结构目录:

 

 

 form.html

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
</head>
<body>
<form action="param" method="POST">
    用户名:<input type="text" name="username"><br/>
    密码:<input type="password" name="password"/><br/>
    <br/>
    爱好:
    <input type="checkbox" name="hobby" value="sing"/>唱歌
    <input type="checkbox" name="hobby" value="dance"/>跳舞
    <input type="checkbox" name="hobby" value="game"/>玩游戏
    <input type="submit" value="提交"/>
</form>
</body>
</html>

注意这里的action 写的是param,那提交表单调用的web.xml对应的URL是为:

 http://localhost:8080/servlet_war_exploded/WEB-FILE/param

所以下面的wen.xml【配置为:

<!--    param-->
    <servlet>
        <servlet-name>param</servlet-name>
        <servlet-class>RequestParamServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>param</servlet-name>
        <url-pattern>/WEB-FILE/param</url-pattern>
    </servlet-mapping>

 

servlet内容为:

@WebServlet(name = "RequestParamServlet")
public class RequestParamServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name = request.getParameter("username");
        String passwd = request.getParameter("password");
        System.out.println("username: " + name);
        System.out.println("password: "+ passwd);

        System.out.print("hobby: ");
        String[] hobby = request.getParameterValues("hobby");
        for (String h:hobby
             ) {
            System.out.print(h+",");
        }

    }
}

 

 

 

 

 

 

 

 

 

 

 

RequestDispatcher实现请求转发

 

 

 

 

请求转发

 

 

 

 

第一个servlet:

@WebServlet(name = "StartingServlet")
public class StartingServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        request.setAttribute("studengname","quanzhiqiang");//往request对象添加属性

        //获取转发对象实例,
        RequestDispatcher dispatcher = request.getRequestDispatcher("/EndinigServlet");
        dispatcher.forward(request,response);
    }
}

注意:

后面的路径,应该是请求URL的路径替换
一开始是http://localhost:8080/servlet_war_exploded/forward
后来是
http://localhost:8080/servlet_war_exploded/EndinigServlet
本不是直接跳到servlet函数里面的。

 

 

转移的servlet;

@WebServlet(name = "EndinigServlet")
public class EndinigServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter pw = response.getWriter();
        String name = (String)request.getAttribute("studengname");
        if (name != null){
            pw.println(name);
        }
    }
}

 

我这里还是配置web.xml目测是要配的:

  <servlet>
        <servlet-name>startend</servlet-name>
        <servlet-class>Forward.StartingServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>EndinigServlet</servlet-name>
        <servlet-class>Forward.EndinigServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>EndinigServlet</servlet-name>
        <url-pattern>/EndinigServlet</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>startend</servlet-name>
        <url-pattern>/forward</url-pattern>
    </servlet-mapping>

 

结果

 

 

 

 

HttpServletResponse

 

 

 

 

 

结果

 

 

 

发送响应消息体:

getWriter() 方法

该方法所获取的字符输出流对象为 PrintWriter 类型。由于 PrintWriter 类型的对象可以直接输出字符文本内容,因此,要想输出内容全部为字符文本的网页文档,则需要使用 getWriter() 方法。

 PrintWriter pw =response.getWriter();
        pw.println("<h1>Default</h1>");

 

 

 

response.sendRedirect重定向

为了实现请求重定向,HttpServletResponse 接口定义了一个 sendRedirect() 方法,该方法用于生成 302 响应码和 Location 响应头,从而通知客户端重新访问 Location 响应头中指定的 URL,

 

 

 

 

简单案列:

登录功能

编写两个html文件:

login.html

<!DOCTYPE html>
<html lang="en">
<!DOCTYPE HTML>
<html>
<head>
    <meta charset="UTF-8">
    <title>用户登录</title>
</head>
<body>
<!-- 把表单内容提交到 servletDemo02 工程下的 LoginServlet -->
<form action="Login" method="POST">
    用户名:<input type="text" name="username"><br/>
    密码:<input type="password" name="password"/><br/>
    <br/>
    <input type="submit" value="登录"/>
</form>
</body>
</html>

 

welcome.html;

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="UTF-8">
    <title>欢迎页面</title>
</head>
<body>
欢迎你,登陆成功!
</body>
</html>

 

login表单的servlet:

@WebServlet(name = "LoginServlet")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        String uname = request.getParameter("username");
        String pd = request.getParameter("password");

        if ("quan".equals(uname) && "2004".equals(pd)){
            response.sendRedirect("/WEB-FILE/welcome.html");
        }else {
            response.sendRedirect("/WEB-FILE/login.html");
        }
    }

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

    }
}

 

配置一下表单提交的URL:

web.xml

    
    <servlet>
        <servlet-name>login</servlet-name>
        <servlet-class>LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>login</servlet-name>
        <url-pattern>/WEB-FILE/Login</url-pattern>
    </servlet-mapping>

 

结果:

 

 成功:

 

 不成功:

 

 

 

 

 

关于乱码

 

request请求信息乱码

下面是从request得到的信息

 

 

解决:

 

 

 

 

 

 

 

 

response乱码

第一种方式:

 

第二种方式:

response.setContentType("text/html;charset=utf-8");

 

 

posted @ 2020-06-28 15:44  小丑quan  阅读(347)  评论(0)    收藏  举报