Servlet目录
6.1 Servlet简介
- 是sun公司开发动态web的一门技术
- 是Java中的一个接口,这个接口就叫Servlet
- 动态web:不同人不同的页面数据
- 如果想要开发一个Servlet程序只需要两个步骤
- 创建一个类实现接口Servlet
- 将开发好的Servlet部署到服务器上
- 我们把实现了Servlet接口的Java程序称为一个Servlet
6.2 HttpServlet
sun公司给出了两个servlet的实现类,其中一个就是HttpServlet,所以我们在实现servlet的时候直接去继承HttpServlet也是可以的
另一个实现类为GenericServlet
- 构建一个普通的maven项目,删除里面的src文件夹,以后我们学习的时候就在这个项目里面建立module,这个空的工程就是maven主工程
- 这么做的好处就是后面创建的项目都是在这个maven项目的基础上创建的子项目,这些子项目称为主项目/工程的一个module,这些module就可以复用主工程中的maven仓库,这就节约了我们每次都需要创建一个新项目,还要重新为这个新项目配置pom.xml的时间
- 关于maven父子工程的理解
<!--主项目-->
<modules>
<module>Servlet-01</module>
</modules>
<!--子项目-->
<parent>
<artifactId>javaweb-02-servlet</artifactId>
<groupId>com.thhh</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
主项目中的jar包子项目可以直接使用,而子项目中的jar包,主项目不能直接使用
主项目和子项目之间的关系就和Java中的子类继承父类是一样的
父类有的我都有,我扩展的只有我自己有,父类取不到
- Maven环境优化
- 修改web.xml为和当前tomcat最匹配的
创建好了子module之后,由于子module是使用IDEA的maven模板创建的,所以它的web.xml版本比较低,所以我们首先需要更新web.xml
<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"
metadata-complete="true">
</web-app>
- 将maven结构搭建完整
然后将使用模板创建的maven项目结构补全,即创建java文件夹和resources文件夹(maven规则大于配置)
- 编写一个servlet程序
①编写一个普通类
②实现servlet接口 —— 直接继承HttpServlet
其实在开发中我们基本只使用doGet()/doPost(),所以在实现HttpServlet抽象类的时候,我们只覆写这个两个方法即可
注意:get和post只是客户端向服务器请求数据的两种不同方式(即来的路不同),在服务器端其实可以使用同一套代码对其进行响应(条条大路通罗马,其中大路就是客户端请求方式,罗马始终只有一个,即我们使用的响应代码可以使用同一个)
//实现
package com.thhh.servlet;
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.io.PrintWriter;
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
writer.print("HELLO SERVLET!");
writer.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
-
编写servlet的映射
为什么需要映射
我们写的是Java程序,但是我们需要通过浏览器对数据进行访问,而浏览器只会去和web服务器交互,所以想要从浏览器中请求到我们写的Java程序,我们就需要将我们写的Java程序注册到服务器上去,并给它一个访问的路径
-
配置tomcat
-
启动测试
原理:
浏览器地址栏输入servlet的请求地址–>web.xml–>找到servlet的路径–>进入servlet这个Java程序中,并执行它–>输出
6.3 Servlet原理
注意:服务器本身就是一堆硬件资源,这些硬件资源一般都会配备linux的OS,而我们的tomcat就是运行在Linux之上的一个程序软件,只是这个软件的功能是监听服务器的8080端口,然后处理和响应客户端的请求,所以上图的一切都应该是在WEB容器中发生的
上图中的流程都是在容器中自动发生了,对我们是不可见的,所以我们在使用的时候没有什么感觉,但是我们需要了解它的原理
6.4 Mapping问题
- 一个请求可以指定一个映射路径
<servlet-mapping>
<servlet-name>HELLOSERVLET</servlet-name>
<url-pattern>/helloservlet</url-pattern>
</servlet-mapping>
- 一个请求可以指定多个映射路径
<!--servlet-name都相同,只是url-pattern不同-->
<servlet-mapping>
<servlet-name>HELLOSERVLET</servlet-name>
<url-pattern>/helloservlet1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>HELLOSERVLET</servlet-name>
<url-pattern>/helloservlet2</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>HELLOSERVLET</servlet-name>
<url-pattern>/helloservlet3</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>HELLOSERVLET</servlet-name>
<url-pattern>/helloservlet4</url-pattern>
</servlet-mapping>
- 一个请求可以指定通用映射路径
<servlet-mapping>
<servlet-name>HELLOSERVLET</servlet-name>
<url-pattern>/hello/*</url-pattern>
</servlet-mapping>
- 默认请求路径
<servlet-mapping>
<servlet-name>HELLOSERVLET</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<!--使用这个映射的效果就是它会将index.jsp顶替了
即这个映射的效果就是设置默认请求路径-->
- 指定一些后缀或前缀
<!--*前面什么都不能加-->
<servlet-mapping>
<servlet-name>HELLOSERVLET</servlet-name>
<url-pattern>*.hello</url-pattern>
</servlet-mapping>
-
web.xml中servlet映射的优先级问题
指定了明确的mapping映射的优先级最高,如果找不到指定的mapping的servlet,才会去找/*的mapping映射
- 指定404页面
<!--404页面-->
<servlet>
<servlet-name>Error</servlet-name>
<servlet-class>com.thhh.servlet.ErrorServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Error</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
按照优先级原则,只要用户输入的地址映射存在,那么用户将跳转到指定的页面;如果用户输入的地址映射不存在,那么用户将被跳转到我们指定的404页面
6.5 ServletContext对象
上下文:就是两个相同类型页面之间做一个连接
WEB容器在启动的时候,会为每一个WEB程序创建一个对应的ServletContext对象,它代表了当前的这个WEN应用
用途:
-
共享数据
- 共享数据说的是一个项目只会有一个ServletContext对象,这个对象被所有的servlet程序共享,一个servlet程序向ServletContext存放的数据另一个Servlet程序可以获取到
//向ServletContext中存数据
package com.thhh.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;
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();//通过当前servlet对象获取ServletContext对象
/* context.setRequestCharacterEncoding("utf-8");*/
context.setAttribute("username","zhangsan");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
//从ServletContext中取数据
package com.thhh.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.io.PrintWriter;
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String username = (String)context.getAttribute("username");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
PrintWriter writer = resp.getWriter();
writer.print("<h3>姓名 = "+username+"</h3>");
writer.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
<!--项目的XML文件-->
<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"
metadata-complete="true">
<servlet>
<servlet-name>helloservlet</servlet-name>
<servlet-class>com.thhh.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloservlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>getservlet</servlet-name>
<servlet-class>com.thhh.servlet.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getservlet</servlet-name>
<url-pattern>/get</url-pattern>
</servlet-mapping>
</web-app>
先访问第一个servlet,使它向ServletContext中存数据
再访问第二个servlet,使它从ServletContext中取数据
- 获取初始化参数
再web.xml中为context配置一些参数
<context-param>
<param-name>DBURL</param-name>
<param-value>jdbc:mysql://localhost:3306/DBName</param-value>
</context-param>
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String url = context.getInitParameter("DBURL");
resp.getWriter().print(url);
}
- 请求转发
- 注意,我们调用的转发方法
- context.getRequestDispatcher():传入转发的路径,获取转发对象
- forward(req, resp):调用这个转发对象的该方法才会执行转发操作,传入req, resp原因就是当前页面只是中间的一个转发处,它不处理任何请求,而客户端的请求和响应对象应该传给真正做数据处理的servlet处理,所以需要传入req, resp
- 注意,我们调用的转发方法
//转发servlet
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
context.getRequestDispatcher("/sd3").forward(req, resp);
}
<!--WEB.XML配置-->
<servlet>
<servlet-name>sd4</servlet-name>
<servlet-class>com.thhh.servlet.ServletDemo04</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>sd4</servlet-name>
<url-pattern>/sd4</url-pattern>
</servlet-mapping>
-
读取资源文件
创建资源文件
username=zhangsan
password=123
读取资源文件可以使用properties对象
使用这个方法的load()即可加载文件数据,但是它要求传入的数据是一个数据流,所以我们就可以使用context对象的getResourceAsStream(“文件路径”)来获取文件的数据流
然后再将其传入properties.load()中
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties properties = new Properties();
properties.load(in);
String username = properties.getProperty("username");
String pwd = properties.getProperty("password");
resp.getWriter().print("username = "+username+"\t"+"pwd = "+pwd);
}
访问该servlet
注意
①
在获取资源的时候我们传入的路径是一个相对路径,那么这个相对路径怎么确定的呢?
首先使用IDEA发布在Tomcat上的项目都会生成一个target文件,这个文件下的war包就是发布到tomcat上的这个WEB应用程序
上面的Servlet-02-1.0-SNAPSHOT是解压状态下的Servlet-02-1.0-SNAPSHOT.war是压缩的javaweb程序
所以我们可以通过观察Servlet-02-1.0-SNAPSHOT下的目录结构来判断应该怎么获取资源文件的相对位置
在前面我们也说过,servletContent对象就代表了这个WEB程序,所以使用这个对象获取资源文件的时候,其实路径就是Servlet-02-1.0-SNAPSHOT
所以资源文件的相对的路径就为:/WEB-INF/classes/db.properties
②
properties
-
在java文件夹下创建一个properties文件
-
在resources文件夹下创建一个properties文件
可以发现,在发布的WEB程序中,所有的java文件和资源文件都被打包在同一个文件夹下,这个文件夹就是classes,我们俗称classes的路径为classpath
-
从上图我我们就可以看出为什么maven项目要求我们创建一个java包和一个resources包,为的就是程序可以自动为我们生成一个classes文件夹,这个文件夹里面有我们在java文件夹中和resources文件夹中写的所有文件
6.6 HttpServletResponse对象
1.简单分类
在前面的servlet原理我们就说过了,服务器应用程序在服务器上运行,当接收到客户端一个请求的时候,容器就会为这个请求创建一个HttpServletRequest对象(获取客户端传给服务器的参数)和HttpServletResponse对象(存储服务器给客户端的响应)
这个对象内部的方法有很多,我们只挑选其中一部分讲解
- 负责向浏览器发送数据的方法
ServletOutputStream getOutputStream() throws IOException;
PrintWriter getWriter() throws IOException;
- 负责向浏览器发送响应头的方法
void setCharacterEncoding(String var1);
void setContentLength(int var1);
void setContentLengthLong(long var1);
void setContentType(String var1);
void setDateHeader(String var1, long var2);
- 响应的状态码
int SC_CONTINUE = 100;
int SC_SWITCHING_PROTOCOLS = 101;
int SC_OK = 200;
int SC_CREATED = 201;
int SC_ACCEPTED = 202;
int SC_NON_AUTHORITATIVE_INFORMATION = 203;
int SC_NO_CONTENT = 204;
int SC_RESET_CONTENT = 205;
int SC_PARTIAL_CONTENT = 206;
int SC_MULTIPLE_CHOICES = 300;
int SC_MOVED_PERMANENTLY = 301;
int SC_MOVED_TEMPORARILY = 302;
int SC_FOUND = 302;
int SC_SEE_OTHER = 303;
int SC_NOT_MODIFIED = 304;
int SC_USE_PROXY = 305;
int SC_TEMPORARY_REDIRECT = 307;
int SC_BAD_REQUEST = 400;
int SC_UNAUTHORIZED = 401;
int SC_PAYMENT_REQUIRED = 402;
int SC_FORBIDDEN = 403;
int SC_NOT_FOUND = 404;
int SC_METHOD_NOT_ALLOWED = 405;
int SC_NOT_ACCEPTABLE = 406;
int SC_PROXY_AUTHENTICATION_REQUIRED = 407;
int SC_REQUEST_TIMEOUT = 408;
int SC_CONFLICT = 409;
int SC_GONE = 410;
int SC_LENGTH_REQUIRED = 411;
int SC_PRECONDITION_FAILED = 412;
int SC_REQUEST_ENTITY_TOO_LARGE = 413;
int SC_REQUEST_URI_TOO_LONG = 414;
int SC_UNSUPPORTED_MEDIA_TYPE = 415;
int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
int SC_EXPECTATION_FAILED = 417;
int SC_INTERNAL_SERVER_ERROR = 500;
int SC_NOT_IMPLEMENTED = 501;
int SC_BAD_GATEWAY = 502;
int SC_SERVICE_UNAVAILABLE = 503;
int SC_GATEWAY_TIMEOUT = 504;
int SC_HTTP_VERSION_NOT_SUPPORTED = 505;
- 2XX:请求响应成功
- 3XX:请求重定向
- 重定向:请求A.HTML,A.HTML让我们去请求B.HTML
- 4XX:找不到资源/资源不存在
- 5XX:服务器代码错误
- 502:网关错误
2.常见应用(文件下载)
- 向浏览器输出消息
- 下载文件
- 获取下载文件的URL
- 获取下载文件的名称名称
- 设置浏览器使它能够支持下载我们需要的东西
- 获取下载文件的输入流
- 创建缓冲区
- 获取outputstream对象
- 将fileoutputstream流写入到buffer缓冲区
- 将outputstream将缓冲区中的数据输出到客户端
package com.thhh.servlet;
/**
* 实现网络文件下载
*/
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
public class ServletDemo04 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// - 获取下载文件在服务器上的URL
String url = "D:\\IntelliJ-IDEA-2020-workspace\\javaweb-02-servlet\\Servlet-02\\target\\Servlet-02-1.0-SNAPSHOT\\WEB-INF\\classes\\bilibili.png";
System.out.println("下载路径 = "+url);
// - 获取文件的名称,作为下载的文件的名称
String fileName = url.substring(url.lastIndexOf("\\")+1);
System.out.println("文件名称 = "+fileName);
// - 设置浏览器使它能够支持下载我们需要的东西,就是设置浏览器的响应头,让它知道这是一个下载响应
resp.setHeader("Content-Disposition", "attachment;"+"filename="+fileName );
// - 获取下载文件的输入流,用于服务器读取文件
InputStream in = new FileInputStream(url);
// - 创建缓冲区
int len = 0;
byte[] buffer = new byte[1024];
// - 获取outputstream对象,用于服务器输出文件
ServletOutputStream out = resp.getOutputStream();
// - 将fileoutputstream流写入到buffer缓冲区
while(((len = in.read(buffer))!=-1)){
out.write(buffer,0,len);
}
// - 将outputstream将缓冲区中的数据输出到客户端
in.close();
out.close();
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
PrintWriter writer = resp.getWriter();
writer.print("文件下载中请稍后..");
writer.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
<servlet>
<servlet-name>sd4</servlet-name>
<servlet-class>com.thhh.servlet.ServletDemo04</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>sd4</servlet-name>
<url-pattern>/sd4</url-pattern>
</servlet-mapping>
注意:当文件名称为中文的时候,我们下载的文件名称就会混乱,所以我们需要使用一个工具类URLEncoder.encode(fileName,“UTF-8”),参数1为原来读出来的名称,参数2为将它转为什么编码格式,这样就能保证下载的文件即使是中文,名称也不会混乱
- 实现重定向
void sendRedirect(String var1) throws IOException;
一个WEB资源B收到客户端A请求之后,它会告诉客户端去访问另外一个WEB资源C,这个过程就叫重定向
常见场景
- 用户登陆
package com.thhh.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class RedirectServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.sendRedirect("/resp/rst");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
package com.thhh.servlet;
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.io.PrintWriter;
public class RedirectServletTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
writer.print("HELLO SERVLET!");
writer.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
<servlet>
<servlet-name>RedirectServlet</servlet-name>
<servlet-class>com.thhh.servlet.RedirectServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RedirectServlet</servlet-name>
<url-pattern>/rs</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>RedirectServletTest</servlet-name>
<servlet-class>com.thhh.servlet.RedirectServletTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RedirectServletTest</servlet-name>
<url-pattern>/rst</url-pattern>
</servlet-mapping>
6.6 面试题
转发和重定向的区别
- 相同点:页面都会实现跳转
- 不同点
- 转发的URL不会发生变化
- 重定向的URL会变化
package com.thhh.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class RequestTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
System.out.print(req.getParameter("username"));
System.out.print(req.getParameter("password"));
resp.sendRedirect("/resp/success.jsp");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<body>
<h1>SUCCESS</h1>
</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<body>
<form action="${pageContext.request.contextPath}/login" method="get">
用户名:<input type="text" name="username">
密码:<input type="password" name="password">
<input type="submit">
</form>
</body>
</html>
6.7 HttpServletRequest
HttpServletRequest代表客户端的请求,用户通过HTTP协议向服务器请求数据/访问服务器,HTTP请求中的所有信息将会风封装到HttpServletRequest对象中,服务器就是通过这个对象中的方法来获取客户端所有信息的
1、获取前端传递的参数
上面的4个方法,我们只需要使用第1和第4个即可,第2和3个基本不使用
方法1返回String,方法4返回String[ ]
2、请求转发
上面两点使用一个例子演示
//后台处理servlet
package com.thhh.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.Arrays;
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobbys = req.getParameterValues("hobbys");//获取集合数据
System.out.println(username);
System.out.println(password);
System.out.println("==========================");
System.out.print(Arrays.toString(hobbys));
//通过请求转发
/* req.getRequestDispatcher("/success.jsp").forward(req,resp);*/
resp.sendRedirect("/req/success.jsp");
/* ServletContext context = this.getServletContext();
context.getRequestDispatcher("/success.jsp").forward(req, resp);*/
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
<%--登陆页面--%>
<%--
Created by IntelliJ IDEA.
User: 18784
Date: 2020/9/2
Time: 10:01
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>登陆</h1>
<%--POST方式提交表单,提交到/login对应的servlet中--%>
<form action="${pageContext.request.contextPath}/login" method="post">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<%--多选框--%>
爱好:
<input type="checkbox" name="hobbys" value="女孩">女孩
<input type="checkbox" name="hobbys" value="代码">代码
<input type="checkbox" name="hobbys" value="唱歌">唱歌
<input type="checkbox" name="hobbys" value="电影">电影
<input type="submit">
</form>
</body>
</html>
<%--登陆成功页面--%>
<%--
Created by IntelliJ IDEA.
User: 18784
Date: 2020/9/2
Time: 10:11
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>SUCCESS!</h2>
</body>
</html>
<!--SERVLET映射配置-->
<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"
metadata-complete="true">
<servlet>
<servlet-name>Login</servlet-name>
<servlet-class>com.thhh.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
</web-app>
注意:到现在我们学习了3种转发+重定向
-
req.getRequestDispatcher("/success.jsp").forward(req,resp); //使用req进行请求转发——URL不变
-
resp.sendRedirect("/req/success.jsp"); //使用resp重定向——URL改变
-
ServletContext context = this.getServletContext(); context.getRequestDispatcher("/success.jsp").forward(req, resp); //使用ServletContext进行请求转发——URL不变