request对象
什么是web资源:网页上显示的所有数据:文本,图片,视频,音频...
web资源的分类
静态资源:没有与数据库交互,数据直接写死文件中 可以使用的技术:HTML/CSS/JS
动态资源:数据来自数据库 可以使用的技术:JSP/Servlet
web服务器:一个运行在高性能计算机上的软件,可以将本机的资源提供给外界访问。
Tomcat发布项目方式
方式1:直接将项目复制到webapps目录下
方式2:虚拟目录:项目可以放在任意位置,需要修改conf/server.xml文件,在第69行添加如下代码:
<Context path="/项目的访问路径" docBase="项目的真实路径" />
方式3:配置独立的xml文件:在conf/catalina/localhost目录下创建xml文件,文件名任意(就是项目访问路径)
在xml文件中添加配置信息: <Context docBase="项目的真实路径" />
什么是Servlet
运行在服务器端的一个小程序(一个实现Servlet的类)
Servlet的作用
接收浏览器的请求并响应数据给浏览器
Servlet的开发步骤
1. 创建一个类继承HttpServlet
2. 重写doGet或doPost方法:处理请求和响应数据
3. 使用注解配置访问地址
4. 部署项目到服务器并启动
5. 通过浏览器访问即可
Servlet生命周期相关方法
1. 无参数构造方法:浏览器第一次访问创建对象时调用,只会调用1次
2. init:执行初始化操作 只会执行1次
3. service:处理请求和响应 每次请求执行1次
4. destory:服务器重启或关闭调用,用于释放资源 只会执行1次
学习目标
- 能够使用工具查看 HTTP 协议内容
通过浏览器查看:按F12-->选择network
- 能够理解 HTTP 协议请求内容
请求行:
组成:请求方式 请求地址 协议和版本
请求头:由各种键值对组成
请求体:就是请求参数,POST请求才有,GET没有
- 能够使用 Request 对象获取 HTTP 协议请求内容
请求行相关方法
获取请求方式: String getMethod();
获取请求地址:String getRequestURI();
获取协议和版本:String getProtocol();
获得项目访问路径:String getContextPath();
获取客户端IP地址:String getRemoteAddr();
请求头相关方法
根据请求头名获得值:String getHeader(String headerName)
获得所有的请求头:Enumeration<String> getHeaderNames();
请求参数相关方法
根据请求参数名获得值:String getParameter(String name);
根据请求参数名获得多个值:String[] getParameterValues(String name);
获得所有请求参数名:Enumeration<String> getParameterNames();
获得所有请求参数信息:Map<String,Object> getParameterMap();
- 能够处理 HTTP 请求参数的乱码问题(1个方)
在获取请求参数之前设置请求参数的编码:request.setCharacterEncoding("utf8");
- 能够使用Request 域对象(三个方法)
往作用域中存储数据:request.setAttribute(String key,Object value)
根据键从作用域中获取数据:request.getAttribute(String key)
根据键从作用域删除键值对:request.removeAttribute(String key)
- 能够使用 Request 对象做请求转发(1个方法)
转发方法:request.getRequestDispatcher("转发地址").forward(request,response);
01_HTTP协议概述-[理解]
1.1 目标
学习HTTP协议:概念、作用、特点、组成
1.2 小结
概念:
英文全称:HyperText Transfer Protocol
中文名字:超文本传输协议
作用:
用于浏览器和服务器之间的数据传输
规定了浏览器和服务器数据的传输格式
组成:
请求:浏览器发数据给服务器的过程
响应:服务器返回数据给浏览器的过程
02_HTTP请求概述-[掌握]
1.1 目标
能够说出HTTP请求的组成内容--[面试题]
1.2 查看HTTP请求
- 在 HTML 页面上,制作 2 个表单提交页面,用户名和密码,get 提交和 post 提交按钮,查看HTTP 请求
<!DOCTYPE html>
<html lang="zh_CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--login 是一个 servlet-->
<h2>GET 提交</h2>
<form action="login" method="get">
用户名:
<input type="text" name="username"><br/>
密码:
<input type="password" name="pwd"><br/>
<input type="submit" value="登录">
</form>
<hr>
<h2>POST 提交</h2>
<form action="login" method="post">
用户名:
<input type="text" name="username"><br/>
密码:
<input type="password" name="pwd"><br/>
<input type="submit" value="登录">
</form>
</body>
</html>
- 查看浏览器与服务器的通讯
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sCeG1uAm-1600306713436)(img/img01.jpg)]
1.3 小结
1、什么是HTTP请求:浏览器访问服务器的过程
2、HTTP请求的组成:
请求行
请求头
请求体
03_请求行概述-[掌握]
1.1 目标
学习请求行的格式和组成
1.2 小结
请求行格式:
POST请求:POST /day02/login HTTP/1.1
GET请求:GET /day02/login?username=jack&pwd=111 HTTP/1.1
请求行组成:请求方式 请求地址 协议和版本
示例:演示GET请求会使用缓存
04_请求头概述-[掌握]
1.1 目标
掌握常见请求头的作用
1.2 小结
常见请求头 | 作用 |
---|---|
Referer | 服务器端获取浏览器上一次访问的地址 |
If-Modified-Since | 服务器端获取浏览器缓存页面的时间 |
User-Agent | 服务器获取客户端操作系统的类型和浏览器类型 |
Connection | 获得HTTP协议连接状态 1.1 保持连接 keep-alive 1.0 断开连接 close |
Host | 获取服务器的地址和端口 |
05_请求体概述-[掌握]
1.1 目标
能够说出什么是请求体
1.2 什么是请求体
用户输入的内容
只要用户输入的并提交给服务器的数据都可以统称为请求参数
1.3 小结
问题:POST和GET请求都有请求体吗?
POST才有,Get没有请求体
06_HttpServletRequest对象概述-[掌握]
1. HttpServletRequest对象是谁创建的?web服务器:Tomcat
2. HttpServletRequest对象的作用?
用来封装浏览器发送给服务器的所有数据:请求行,请求头,请求体
需要调用request对象的方法获得请求数据
07_获取请求行相关方法-[掌握]
1.1 目标
使用请求对象的方法获取请求行信息
1.2 示例演示
- 示例:创建一个 RequestLineServlet:用于获取请求行中相关信息的方法,并且输出到网页上。
package com.pkx._01request_line;
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;
/**
* 需求:创建一个 RequestLineServlet:用于获取请求行中相关信息的方法,并且输出到网页上。
*/
@WebServlet(urlPatterns = "/line")
public class RequestLineServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置内容类型和编码
response.setContentType("text/html;charset=utf-8");
// 获得字符打印流
PrintWriter out = response.getWriter();
// 请求方式 192.168.32.166
out.println("请求方式:" + request.getMethod() + "<br/>");
// 统一资源标识符: /day02/line isbn 唯一
out.println("统一资源标识符:" + request.getRequestURI() + "<br/>" );
// 统一资源定位符: http://localhost:8080/day02/line
out.println("统一资源定位符:" + request.getRequestURL()+ "<br/>");
// 协议和版本
out.println("协议和版本:" + request.getProtocol() + "<br/>" );
// 上下文路径:项目的访问路径
out.println("项目的访问路径:" + request.getContextPath() + "<br/>");
// 客户端IP地址
out.println("客户端IP地址:" + request.getRemoteAddr()+ "<br/>");
}
}
- 网页显示如下
1.3 小结
HttpServletRequest对象的方法 | 功能说明 |
---|---|
String getMethod() | 获取请求方式 |
String getRequestURI() | 获得统一资源标识符 |
StringBuffer getRequestURL() | 获得统一资源定位符:网址 |
String getProtocol() | 获得协议和版本 |
String getContextPath() | 获得项目访问路径 |
String getRemoteAddr() | 获得客户端IP地址 |
08_获取请求头相关方法-[掌握]
1.1 目标
使用请求对象的方法获取请求头信息
1.2 示例
- 需求:创建一个RequestHeaderServlet:得到所有的请求头信息,并输出所有的请求值信息。
package com.pkx._02request_header;
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;
import java.util.Enumeration;
/**
* 创建一个RequestHeaderServlet:得到所有的请求头信息,并输出所有的请求值信息。
*/
@WebServlet(urlPatterns = "/header")
public class RequestHeaderServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置内容类型和编码
response.setContentType("text/html;charset=utf-8");
// 获得字符打印流
PrintWriter out = response.getWriter();
// 根据请求头名字获得值
String host = request.getHeader("host");
out.println("host = " + host + "<hr>");
// 获得所有请求头名字
// Enumeration 是迭代器的前身 Iterator
Enumeration<String> it = request.getHeaderNames();
// 判断是否有下一个元素
while (it.hasMoreElements()){
// 获得下一个元素
String headerName = it.nextElement();
// 根据请求头名获取值
String headerValue = request.getHeader(headerName);
out.println(headerName+":"+headerValue + "<br>");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
- 网页显示如下图:
设置Servlet模板
1.3 小结
HttpServletRequest对象的方法 | 功能描述 |
---|---|
String getHeader(String headName) | 根据请求头名字获得值 |
Enumeration getHeaderNames() | 获得所有请求头的名字 返回的一个迭代器 hasMoreElement:判断是否有下一个元素 nextElement:获得下一个元素 |
09_获取请求参数相关方法-[掌握]
1.1 目标
使用请求对象的方法获取请求参数信息
1.2 示例演示
-
需求:用户注册得到表单提交的参数
-
准备表单数据
<h2>用户注册</h2>
<form action="register" method="post">
用户名: <input type="text" name="name"><br/>
性别: <input type="radio" name="gender" value="男" checked="checked"/>男
<input type="radio" name="gender" value="女"/>女 <br/>
城市:
<select name="city">
<option value="广州">广州</option>
<option value="深圳">深圳</option>
<option value="珠海">珠海</option>
</select>
<br/>
爱好:
<input type="checkbox" name="hobby" value="上网"/>上网
<input type="checkbox" name="hobby" value="上学"/>上学
<input type="checkbox" name="hobby" value="上车"/>上车
<input type="checkbox" name="hobby" value="上吊"/>上吊
<br/>
<input type="submit" value="注册"/>
</form>
- 创建RegisterServlet:获得所有表单参数并输出
package com.pkx._03request_params;
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;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Map;
/**
需求:用户注册得到表单提交的参数
*/
@WebServlet(urlPatterns = "/register")
public class RegisterServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
// 设置内容类型和编码
response.setContentType("text/html;charset=utf-8");
// 获得字符打印流
PrintWriter out = response.getWriter();
// 根据参数名获得参数值
String username = request.getParameter("username");
out.println("username = " + username + "<br>");
// 根据参数名获得多个参数值
String[] hobbies = request.getParameterValues("hobby");
out.println("hobbies = " + Arrays.toString(hobbies) + "<hr>");
// 获得所有请求参数的名字
Enumeration<String> it = request.getParameterNames();
// 遍历所有名字
while (it.hasMoreElements()) {
// 获得参数名字
String name = it.nextElement();
// 根据参数名获得值
String[] values = request.getParameterValues(name);
out.println(name + " = " + Arrays.toString(values) + "<br>");
}
out.println("<hr>");
// 获得所有请求参数信息:封装到map集合中
// key:参数名 value:参数的值
Map<String, String[]> map = request.getParameterMap();
for (Map.Entry<String, String[]> entry : map.entrySet()) {
out.println(entry.getKey() + " = " + Arrays.toString(entry.getValue()) + "<br>");
}
}
}
1.3 小结
HttpServletRequest对象的方法 | 描述 |
---|---|
String getParameter(String name) | 根据参数名获得参数值 |
String[] getParameterValues(String name) | 根据参数名获得多个参数值 返回是数组 |
Enumeration getParameterNames() | 获得所有请求参数的名字 返回迭代器对象 |
Map<String,String[]> getParameterMap() | 获得所有请求参数信息 返回map集合 key:参数名 value:参数值 |
10_BeanUtils工具使用-封装参数-[掌握]
1.1 目标
利用BeanUtils工具实现数据的封装:将Map集合数据封装到JavaBean对象中
1.2 示例演示
- 将BeanUtils相关jar包导入项目,如下图位置
- User类代码
/**
JavaBean/entity
*/
public class User {
// 成员变量
private String username;
private String gender;
private String[] hobby;
private String city;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String[] getHobby() {
return hobby;
}
public void setHobby(String[] hobby) {
this.hobby = hobby;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", gender='" + gender + '\'' +
", hobby=" + Arrays.toString(hobby) +
", city='" + city + '\'' +
'}';
}
}
- 利用BeanUtils将表单参数封装到User对象中
package com.pkx._03request_params;
import org.apache.commons.beanutils.BeanUtils;
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;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Map;
/**
需求:使用BeanUtils封装请求参数到JavaBean对象中
*/
@WebServlet(urlPatterns = "/register")
public class RegisterServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try{
request.setCharacterEncoding("utf-8");
// 设置内容类型和编码
response.setContentType("text/html;charset=utf-8");
// 获得请求参数信息
Map<String, String[]> map = request.getParameterMap();
// 创建User对象
User user = new User();
System.out.println("封装前:" + user);
// 使用BeanUtils工具类的方法封装请求参数
// populate:将map集合的数据封装到指定的对象中
// 参数1:Object bean 自定义的JavaBean对象
// 参数2:Map<String, ? extends Object> properties map集合
// map集合的key和对象的成员变量名要一致才会封装
BeanUtils.populate(user,map);
System.out.println("封装后:" + user);
} catch(Exception e){
e.printStackTrace();
}
// 三层架构
// 表现层 --> 业务层 --> 数据访问层 --> 操作数据库
// JavaBean对象 实体类 Student
// map ==> User ==>
// User user = new User();
// user.setUsername(username);
// user.setGender(gender);
// 只要满足三个条件的类就是一个JavaBean
/*
1. 类必须是public修饰的
2. 类必须有public的无参数构造方法
3. 成员变量必须提供对应的setter&getter方法
*/
}
}
1.3 小结
BeanUtils常用方法 | 作用 |
---|---|
void populate(Object bean, Map<String, Object> properties) | 将map集合的数据封装到指定的bean对象 简单记忆:后付钱(后面的参数赋值给前面的对象) |
11_参数的乱码问题-[掌握]
1.1 目标
能够说出参数乱码的原因并解决乱码问题
1.2 小结
乱码原因:Tomcat默认使用欧洲码表(ISO-8859-1:不支持汉字)解码参数
解决方法:
在获取请求参数之前通过请求对象的方法设置解码使用的码表,代码:request.setCharacterEncoding("utf8");
Tomcat8.0开始,GET方式请求不需要考虑乱码问题了,如果使用Tomcat8.0之前的版本,则也需要手动处理乱码问题,详情参考:https://blog.csdn.net/lxf512666/article/details/52939573/
12_转发和重定向概述-[掌握]
1.1 目标
能够说出转发和重定向的作用
掌握实现转发和重定向的方法
1.2 示例代码
- 需求:使用转发和重定向实现页面跳转
package com.pkx._04forward_redirect;
import javax.servlet.RequestDispatcher;
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;
/**
需求:当浏览器访问OneServlet时转发或重定向到TwoServlet
*/
@WebServlet(urlPatterns = "/one")
public class OneServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 实际开发会先处理业务逻辑
// 转发到TwoServlet
// 获得转发器对象
/* RequestDispatcher requestDispatcher = request.getRequestDispatcher("two");
// 调用转发器的方法执行转发操作:页面跳转
requestDispatcher.forward(request, response);*/
// 简化代码
// request.getRequestDispatcher("two").forward(request, response);
// 重定向到TwoServlet
response.sendRedirect("two");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
1.3 小结
1. 转发和重定向的作用:实现页面的跳转
2. 实现转发和重定向的方法
转发的方法:request.getRequestDispatcher("要转发的页面地址").forward(request,response);
重定向方法:response.sendRedirect("重定向方法")
13_转发和重定向的区别-[理解]
1.1 目标
知道转发和重定向的区别(面试题)
1.2 转发和重定向的区别对比表
区别 | 转发 | 重定向 |
---|---|---|
地址栏 | 不会变化 | 会变成重定向的页面地址 |
跳转位置 | 服务器内部执行的跳转 | 浏览器端执行的跳转 |
请求次数 | 1次 | 2次 |
请求域数据 | 不会丢失 | 会丢失 |
- 面试题:转发或重定向后续代码还会执行吗?
还会执行,但没有意义了,一般不会在后面编写代码了
- 面试题:什么时候使用转发,什么时候使用重定向?
如果需要共享请求域的数据,则只能使用转发,否则可以随便选择。
14_Servlet作用域概述-[掌握]
1.1 目标
知道作用域是什么以及作用是什么
1.2 讲解
1. 什么是作用域:服务器端的一小块内存区域,底层结构就是一个map集合,用于Servlet之间共享数据
2. Servlet的三个作用域:请求域、会话域、上下文域
- 作用域相关方法
请求域相关方法 | 作用 |
---|---|
Object getAttribute(“键”) | 根据键从请求域中获得值 |
void setAttribute(“键”,Object数据) | 往请求域中存储键值对数据 |
void removeAttribute(“键”) | 根据键从请求域中删除键值对数据 |
15_请求域概述和演示-[掌握]
1.1 目标
使用请求域实现Servlet之间共享数据
1.2 示例演示
- 需求:OneServlet 创建一个键和值,转发到另一个 TwoServlet,从 TwoServlet 中取出键和值,并且输出。
- 示例代码
package com.pkx._05request_scope;
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;
/**
需求:OneServlet 创建一个键和值,转发到另一个 TwoServlet,从 TwoServlet 中取出键和值,并且输出。
*/
@WebServlet(urlPatterns = "/first")
public class FirstServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 往请求域中存储键值对数据
request.setAttribute("username", "lily");
// 转发到second
request.getRequestDispatcher("second").forward(request, response);
// 重定向second
// response.sendRedirect("second");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
package com.pkx._05request_scope;
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(urlPatterns = "/second")
public class SecondServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置内容类型和编码
response.setContentType("text/html;charset=utf-8");
// 获得字符打印流
PrintWriter out = response.getWriter();
// 从请求域中获取数据
Object username = request.getAttribute("username");
out.println("用户名:" + username);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
1.3 小结
请求域的作用范围:在同一次请求中有效
16_案例:实现登录功能-功能分析和环境搭建-[掌握]
1.1 案例需求
- 实现用户登录功能
1.2 案例效果
-
用户名和密码正确,将用户信息保存在请求域中,转发到另一个 Servlet,显示用户登录成功
-
用户名和密码错误,重定向到另一个 html 页面,显示登录失败。
-
使用表示层,业务层,数据访问层的三层结构实现
1.3 案例流程图
、
1.4 准备登录界面
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>用户登录</title>
</head>
<body>
<h2>用户登录</h2>
<form action="login" method="post">
<table>
<tr>
<td>用户名</td>
<td><input type="text" name="username"/></td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="password"/></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="登录"/></td>
</tr>
</table>
</form>
</body>
</html>
17_案例:实现登录功能-控制器-[掌握]
1.1 步骤分析
1. 接收请求参数:用户名和密码
2. 判断用户名和密码是否正确
3. 用户名和密码正确则跳转到欢迎页面(Servlet):获取用户信息显示
4. 用户名和密码不正确则跳转到失败页面(html)
1.2 示例代码
package com.pkx._06login_demo;
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;
/**
* 需求:实现登录逻辑处理
*
* 实现步骤
1. 接收请求参数:用户名和密码
2. 判断用户名和密码是否正确
3. 用户名和密码正确则跳转到欢迎页面(Servlet):获取用户信息显示
4. 用户名和密码不正确则跳转到失败页面(html)
*/
@WebServlet(urlPatterns = "/login")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 0. 设置请求参数的编码
request.setCharacterEncoding("utf-8");
// 1. 接收请求参数:用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("pwd");
// 2. 判断用户名和密码是否正确:admin admin
if ("admin".equals(username) && "admin".equals(password)){
// 3. 用户名和密码正确则跳转到欢迎页面(Servlet):获取用户信息显示
// 3.1 往请求域中存储数据:用户数据(用户对象)
request.setAttribute("username", username);
// 3.2 转发到欢迎页面
request.getRequestDispatcher("welcome").forward(request, response);
} else {
// 4. 用户名和密码不正确则跳转到失败页面(html)
response.sendRedirect("error.html");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
1.3 成功页面:SuccessServlet
package com.pkx._06login_demo;
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(urlPatterns = "/welcome")
public class WelcomeServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置内容类型和编码
response.setContentType("text/html;charset=utf-8");
// 获得字符打印流
PrintWriter out = response.getWriter();
// 从请求域中获得用户名
Object username = request.getAttribute("username");
out.println("欢迎你回来:" + username);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
1.4 失败页面:failure.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>登录失败</h1>
<a href="login.html">请重试</a>
</body>
</html>
18_关于根目录使用说明-[理解]
1.1 目标
能够在转发和重定向时正确使用根目录
1.2 根目录 /
package com.pkx._04forward_redirect;
import javax.servlet.RequestDispatcher;
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;
/**
需求:当浏览器访问OneServlet时转发或重定向到TwoServlet
/:代表根目录
/:如果使用在客户端(浏览器)则代表浏览器端的根目录
/:如果使用在服务器端则代表服务器端的根目录
浏览器端的根目录:http://localhost:8080/
服务器端的根目录:http://localhost:8080/项目访问地址/
http://localhost:8080/day02/one
http://localhost:8080/day02/two
/:代表服务器端的根目录:http://localhost:8080/项目访问地址/
*/
@WebServlet(urlPatterns = "/one")
public class OneServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 实际开发会先处理业务逻辑
// 转发到TwoServlet
// 获得转发器对象
/* RequestDispatcher requestDispatcher = request.getRequestDispatcher("two");
// 调用转发器的方法执行转发操作:页面跳转
requestDispatcher.forward(request, response);*/
// 简化代码
// 转发地址以/开头:/ 代表的是服务器端的根目录,因为转发是在服务器端执行的
// 转发地址没有以/开头,则代表使用相对路径,相对当前Servlet的访问地址,和当前Servlet访问路径同级
// c:/aa/bb/xx.txt xx.txt
// request.getRequestDispatcher("two").forward(request, response);
// 重定向到TwoServlet
// 重定向地址以/开头:/ 代表的是浏览器端的根目录,因为重定向是在浏览器端执行的
// /:http://localhost:8080/
response.sendRedirect("two");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
1.3 小结
服务器端根目录:http://localhost:8080/项目访问地址/
浏览器端根目录:http://localhost:8080/
19_在idea中切换部署项目-[掌握]
1.1 目标
通过idea切换项目的部署
通过idea同时部署多个项目
通过idea导入其他web项目并部署访问
1.2 小结
操作步骤参考word的第7节