Request&Response
- request对象和response对象原理
- request和response是由服务器创建的
- request对象是用于获取请求消息
- response对象用于设置响应消息
Request
- 体系结构
- Requset功能
- 获取请求消息数据
- 获取请求行数据:
请求方法 /URI?key=value... HTTP/1.1
- 获取请求方式(请求方法):String
getMethod()
- 获取虚拟目录(/资源地址):String
getContxtPath()
- 获取Servlet路径:String
getServletPath()
- 获取请求参数:Sting
getQueryString()
- 获取请求的URI(/URI):String
getRequestURI()
- 获取URL:String
getRequestURL()
- 获取协议及版本:String
getProtocol()
- 获取客户机IP:String
getRemoteAddr()
- 获取请求方式(请求方法):String
- 获取请求头数据
- 根据名称获取值:String
getHeader(String name)
- 获取全部的名称:Enumeration
getHeaderNames()
- user-agent:浏览器版本信息-可用于适配不同浏览器
- referer:获取来源-可用于防盗链操作
- 根据名称获取值:String
- 获取请求体数据(只有POST请求方式才有请求体,封装了请求的参数)
- 获取步骤:
- 获取流对象
- 字符输入流:BufferedReader
getReader()
- 字节输入流:ServletInputStream
getInputStream()
- 字符输入流:BufferedReader
- 从流对象中获取数据
- 获取流对象
- 获取步骤:
- 获取请求行数据:
- 其他功能:
- 获取请求参数通用方式
- String
getParameter(String name)
-> 根据参数名称获取参数值 - String[ ]
getParameterValues(String name)
-> 根据参数名称获取参数值数组(复选框) - Enumeration
getParameterNames()
-> 获取所有的请求参数名 - Map<String, String[ ]>
getParameterMap()
->获取所有参数的map集合
- String
- 请求转发:一种在服务器内部的资源跳转方式
- 转发步骤:
- 通过request对象回去请求转发器对象:RequestDispatcher
getRequsetDispatcher(String path)
- 使用RequestDispatcher对象进行转发:
forward(ServletRequest req, ServletResponse resp)
- 通过request对象回去请求转发器对象:RequestDispatcher
- 特点:
- 浏览器地址栏不会发生变化
- 只能转发到当前服务器内部的资源
- 转发是一次请求
- 转发步骤:
- 共享数据
- 域对象:一个有作用范围的对象,可以在范围内共享数据
- Request域:代表一次请求范围,一般用于请求转发的多个资源中共享数据
- 共享方法:
- void
setAttribute(String name, Object obj)
-> 存储数据 - Object
getAttribute(String name)
-> 通过键获取数据 - void
removeAttribute(String name)
-> 通过名称移除数据
- void
- 获取ServletContext
- ServletContext
getServletContext()
:org.apache.catalina.core.ApplicationContextFacade
- ServletContext
- 获取请求参数通用方式
- 中文乱码:Tomcat8以上以get方式请求的数据不会乱码
- POST方式解决办法(设置requset编码):
req.setCharacterEncoding("utf-8");
- POST方式解决办法(设置requset编码):
- 获取请求消息数据
登录案例
- 用户登录案例需求:
- 编写login.html登录界面
- 使用Druid数据库连接池技术操作mysql
- 使用JdbcTemplate技术封装JDBC
- 登录成功后跳转到SuccessServlet展示:登录成功!用户名,欢迎您
- 登录失败跳转到FailServlet展示:登录失败,用户名或密码错误
- 开发步骤
- 创建项目,编写html页面,配置文件,导入jar包
- 创建数据库环境
CREATE TABLE USER(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(32) UNIQUE NOT NULL,
password varchar(32) NOT NULL
);
- 创建cn.study.domain,创建User类
public class User {
private int id;
private String username;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
- 创建cn.study.dao,创建类UserDao,提供login方法
public class UserDao {
/**
* 声明JdbcTemplate公用
*/
private final JdbcTemplate template = new JdbcTemplate(JdbcUtils.getDataSource());
/**
* 登录方法
* @param loginUser 只有用户名和密码
* @return user包含所有的用户信息
*/
public User login(User loginUser){
try{
//编写sql
String sql = "SELECT * FROM USER WHERE username = ? and password = ?";
//调用query方法
User user = template.queryForObject(sql,
new BeanPropertyRowMapper<User>(User.class),
loginUser.getUsername(),loginUser.getPassword());
return user;
}catch (DataAccessException e){
e.printStackTrace();
return null;
}
}
}
- 编写cn.study.web.servlet.LoginServlet
- BeanUtils:简化数据的封装
- 用于封装JavaBean:标准的Java类
- 类必须被public修饰
- 必须提供空参构造器
- 成员变量必须使用private
- 提供公共的setter,getter
- 功能:封装数据
- 方法:
- getProperty() -> 获取属性
- setProperty() -> 设置属性
- populate(Object obj,Map map) -> 封装对象
- 用于封装JavaBean:标准的Java类
Response对象
- 功能:设置响应消息:
- 设置响应行
- 设置状态码:
setStatus(int sc)
- 设置状态码:
- 设置响应头
- 设置头:
setHeader(String name, String value)
- 设置头:
- 设置响应体(流)
- 使用步骤:
- 获取输出流
- 字符输出流:PrintWriter
getWriter()
- 字节输出流:ServletOutputStream
getOutputStream()
- 字符输出流:PrintWriter
- 使用输出流,将数据输出到客户端浏览器
- 获取输出流
- 使用步骤:
- 完成重定向:资源跳转的方式
response.sendRedirect("URI")
- 重定向特点
- 地址栏发生变化
- 重定向可以访问其他站点的资源
- 重定向是两次请求,不能使用request对象共享数据
- 路径写法
- 路径的分类
- 相对路径:不能确定唯一资源,以./开头
- 绝对路径:可以确定唯一资源,以/开头
- 规则:判断定义的路径给谁使用-判断请求从哪发出
- 给客户端浏览器使用:需要加虚拟目录(项目的访问路径)
- 给服务器使用:不需要加虚拟目录
- 规则:判断定义的路径给谁使用-判断请求从哪发出
- 路径的分类
- 服务器输出字符数据
- 获取字符输出流
- 输出数据
- 乱码解决:
resp.setContentType("text/html;charset=utf-8");
- 服务器输出字节数据
- 获取字节输出流
- 输出数据
- 设置响应行
验证码案例
ServletContext对象
代表整个Web应用,可以和程序的容器(服务器)来通信
- 获取ServletContext对象:
- 通过Request对象获取 ->
request.getServletContext();
- 通过HttpServlet对象获取 ->
this.getServletContext();
- 通过Request对象获取 ->
- 功能:
- 获取MIME类型:
- MIME类型:在互联网通信过程中定义的一种文件时数据类型;格式:大类型/小类型(text/html)
getMimeType(String fileName);
- 域对象(所有用户请求的数据):
setAttribute(String name, Object obj)
getAttribute(String neme);
remeAttribute(Stting name);
- 获取文件的真实路径(服务器路径)
getRealPath(String path)
- web目录对应:/
- src目录对应:/WEB-INF/classes/
- 获取MIME类型:
文件下载案例
需求:1.页面显示超链接 2.点击超链接弹出下载提示框 3.完成图片文件下载
- 步骤:
- 定义页面,编辑href属性,指向serlvet,传递资源名称filename
- 定义servlet
- 获取文件名称
- 使用字节输入流加载文件进内存
- 指定response的响应头:以附件形式打开
- 将数据写出到response输出流
- 中文文件名
- 获取客户端使用的浏览器版本信息
- 根据不同的版本信息,设置filename