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 主要有两大功能,具体如下。
- 根据用户请求方式的不同,定义相应的 doXxx() 方法处理用户请求。例如,与 GET 请求方式对应的 doGet() 方法,与 POST 方式对应的 doPost() 方法。
- 通过 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");