一、HttpServletRequest
1、概念
- ServletRequest接口的一个子接口,专门处理http请求相关的内容,由于Http请求协议分为请求首行、请求头、请求体
- HttpServletRequest与请求首行、请求头、请求参数相关的方法
- 请求转发与重定向进行区分
- HttpServletRequest它还是一个域对象
2、作用
获取浏览器发送过来的数据
3、操作请求行
格式
请求方式 请求资源 协议/版本
方法 | 说明 |
---|---|
String getMethod() | 获取请求方式 |
String getRemoteAddr() | 获取ip地址 |
String getContextPath() | 在java中获取项目名称 |
方法 | 说明 |
---|---|
getRequestURI() | 获取的是 从项目名到参数之前的内容:/web_day36/regist |
getRequestURL() | 获取的带协议的完整路径:http://localhost:8080/web_day36/regist |
String getQueryString() | get请求的所有参数:username=tom&password=123 |
String getProtocol() | 获取协议和版本 |
获取请求首行案例
RequesetRowServlet.java
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @ClassName: RequesetRowServlet
* @Description:操作请求行
* @author jsz
* @date 2018年8月9日
*/
public class RequesetRowServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
System.out.println("***********重要的方法***********");
// 获取IP地址
String remoteAddr = request.getRemoteAddr();
System.out.println("IP地址" + remoteAddr);// IP地址0:0:0:0:0:0:0:1
// 获取请求方式
String method = request.getMethod();
System.out.println("请求方式:" + method);// 请求方式:GET
// 获取项目名称
String contextPath = request.getContextPath();
System.out.println("项目名称" + contextPath);// /web_day36
System.out.println("***********了解的方法***********");
// 获取请求URI
String requestURI = request.getRequestURI();
System.out.println("获取请求URI" + requestURI);// /web_day36/RequesetRowServlet
// 获取请求URL
String requestURL = request.getRequestURL().toString();
System.out.println("获取请求URL" + requestURL);// http://localhost:8080/web_day36/RequesetRowServlet
// 获取请求参数
String params = request.getQueryString();
System.out.println("请求参数" + params);// username=tom&password=123
// 获取协议版本
String protocol = request.getProtocol();
System.out.println("协议版本:" + protocol);// 协议版本:HTTP/1.1
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
地址
http://localhost:8080/web_day36/RequesetRowServlet?username=tom&password=123
结果
4、获取请求头
格式
key/value(value可以是多个值)
方法 | 说明 |
---|---|
String getHeader(String key) | 通过key获取指定的value |
方法 | 说明 |
---|---|
Enumeration getHeaders(String name) | 通过key获取指定的多个value |
Enumeration getHeaderNames() | 获取所有的请求头的名称 |
int getIntHeader(String key) | 获取整型的请求头 |
long getDateHeader(String key) | 获取时间的请求头 |
请求头 | 说明 |
---|---|
user-agent | 浏览器内核 msie firefox chrome |
referer | 页面从那里来 防盗链 |
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @ClassName: RequesetHeaderServlet
* @Description:操作请求头
* @author jsz
* @date 2018年8月9日
*/
public class RequesetHeaderServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
// 获取浏览器内核
String agent = request.getHeader("user-agent");
System.out.println("浏览器内核:" + agent);//
// 获取referer
String referer = request.getHeader("referer");
if (referer == null) {
System.out.println("直接在地址栏输入的");
} else if (referer.contains("localhost")) {
System.out.println("我自己点的...");//
} else {
System.out.println("盗链可耻...");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
5、获取请求参数
username=tom&password=123&hobby=drink&hobby=sleep
方法 | 说明 |
---|---|
String getParameter(String key) | 获取一个值 |
String[] getParameterValues(String key) | 通过一个key获取多个值 |
Map<String,String[]> getParameterMap() | 获取所有的参数名称和值 |
案例
import java.io.IOException;
import java.util.Arrays;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @ClassName: RequesetParamsServlet
* @Description:操作请求参数
* @author jsz
* @date 2018年8月9日
*/
public class RequesetParamsServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
// 获取单个值
String username = request.getParameter("username");
System.out.println(username);
// 获取多个值
String[] hobbys = request.getParameterValues("hobby");
for (String hobby : hobbys) {
System.out.println(hobby);
}
// 获取所有请求数据
Map<String, String[]> parameterMap = request.getParameterMap();
for (Entry<String, String[]> map : parameterMap.entrySet()) {
System.out.println(map.getKey() + "\t" + Arrays.toString(map.getValue()));
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
地址
结果
6、请求的中文乱码
对于get请求
参数追加到地址栏,会使用utf-8编码,服务器(tomcat7)接受到请求之后,使用iso-8859-1解码,所以会出现乱码
- new String(参数.getBytes("iso-8859-1"),"utf-8");
post请求方法
只需要将请求流的编码设置成utf-8即可
- request.setCharacterEncoding("utf-8");
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @ClassName: EncodeServlet
* @Description:解决post请求的编码问题
* @author jsz
* @date 2018年8月9日
*/
public class EncodeServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
// 设置post请求的编码
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
System.out.println("username="+username);
String password = request.getParameter("password");
System.out.println("password="+password);
String[] hobby = request.getParameterValues("hobby");
for (String string : hobby) {
System.out.println(string);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
HttpServletRequest域对象
作用
操作一次请求里面的数据
生命周期
- 创建:一次请求来的时候
- 销毁:响应生成的时候
- 向request域对象中设置值,然后重定向,获取不到request域对象中的值
方法
方法 | 说明 |
---|---|
setAttribute(String name, Object obj); | 向域对象中设置值 |
getAttribute(String name); | 从域对象获取值 |
removeAttribute(String name); | 从域对象中删除值 |
案例1:用户注册
1、设计数据库表结构
2、根据数据库表结构创建JavaBean
package com.itheima.domain;
import java.io.Serializable;
public class User implements Serializable {
private int uid;
private String username;
private String password;
private String birthday;
private String hobby;
public User() {
super();
// TODO Auto-generated constructor stub
}
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
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;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public String getHobby() {
return hobby;
}
public void setHobby(String hobby) {
this.hobby = hobby;
}
}
3、导入相关jar包和工具类
4、页面
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户注册</title>
</head>
<body>
<form action="http://localhost:8080/web_day36/RegisterServlet" method="post">
用户名:<input type="text" name="username" /><br/>
密码:<input type="password" name="password" /><br/>
确认密码:<input type="password" name="repassword" /><br/>
生日:<input type="text" name="birthday" /><br/>
爱好:<input type="checkbox" name="hobby" value="抽烟"/>抽烟
<input type="checkbox" name="hobby" value="喝酒"/>喝酒
<input type="checkbox" name="hobby" value="烫头"/>烫头<br/>
<input type="submit" value="注册" />
</form>
</body>
</html>
5、web层代码
package com.itheima.web.servlet;
import java.io.IOException;
import java.util.Arrays;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.BeanUtils;
import com.itheima.domain.User;
import com.itheima.service.UserService;
public class RegisterServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 处理post请求中文乱码问题
request.setCharacterEncoding("utf-8");
// 处理响应的中文乱码问题
response.setContentType("text/html;charset=utf-8");
// 1.创建实体类
User user = new User();
try {
// 2.使用BeanUtils封装数据
BeanUtils.populate(user, request.getParameterMap());
// 3.单独封装爱好(要有这个意识)
String[] hobbies = request.getParameterValues("hobby");
user.setHobby(Arrays.toString(hobbies));
// 4.调用service层方法
UserService service = new UserService();
service.register(user);
// 5.给出提示信息(只要能执行下面这一行代码说明注册成功的)
request.setAttribute("msg", "<h3 style='color:green'>恭喜您,注册成功!</h3>");
// 6.转发到MsgServlet
request.getRequestDispatcher("MsgServlet").forward(request, response);
} catch (Exception e) {
new RuntimeException(e);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
package com.itheima.web.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MsgServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 处理post请求中文乱码问题
request.setCharacterEncoding("utf-8");
// 处理响应的中文乱码问题
response.setContentType("text/html;charset=utf-8");
// 1.获得request域中的数据
String msg = (String) request.getAttribute("msg");
// 2.响应到浏览器
response.getWriter().write(msg);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
6、service层代码
package com.itheima.service;
import java.sql.SQLException;
import com.itheima.dao.UserDao;
import com.itheima.domain.User;
public class UserService {
public void register(User user) throws SQLException {
UserDao dao = new UserDao();
dao.register(user);
}
}
7、dao层代码
package com.itheima.dao;
import java.sql.SQLException;
import org.apache.commons.dbutils.QueryRunner;
import com.itheima.domain.User;
import com.itheima.utils.C3P0Utils;
public class UserDao {
public void register(User user) throws SQLException {
// 1.获得QueryRunner核心对象
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
// 2.编写SQL语句
String sql = "insert into user values(null,?,?,?,?)";
// 3.设置实际参数
Object[] params = { user.getUsername(), user.getPassword(), user.getBirthday(), user.getHobby() };
// 4.执行插入操作
qr.update(sql, params);
}
}
案例二:登录功能完善
1、页面
登录页面
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录页面</title>
</head>
<body>
<!--
Web路径问题:分为客户端路径和服务器端路径
客户端路径:超链接(img location.href)、表单、重定向
绝对路径:http://localhost:8080/web_day36/LoginServlet
相对路径:
带/:相对的是当前服务器,你将/理解为webapps目录 /web_day36/LoginServlet
不带/:相对当前文件 (LoginServlet)
本来访问Servlet的写法:http://localhost:8080/web_day36/LoginServlet 【前提是:Servlet使用是是默认的配置】
本来访问文件login.html的写法:http://localhost:8080/web_day36/login.html
此时通过观察,我们发现LoginServlet与login.html在同一级,直接写Servlet名称
服务器端路径:请求转发
相对路径:带/和不带/,都是相对当前web应用(当前项目)
-->
<!-- 客户端路径:有3种写法 -->
<!-- <form action="http://localhost:8080/web_day36/LoginServlet" method="post"> -->
<!-- <form action="/web_day36/LoginServlet" method="post"> -->
<form action="LoginServlet" method="post">
用户名:<input type="text" name="username"><br/>
密码:<input type="password" name="password"><br/>
<input type="submit" value="登录">
</form>
</body>
</html>
登录成功页面
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Strict//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<!-- 3秒后,跳转到index.html页面 -->
<meta http-equiv="Refresh" content="3; url=http://localhost:8080/web_day36/index.html">
<title>登录成功提示信息页面</title>
</head>
<body>
<h3 style='color:green'>恭喜您,登录成功!,三秒后跳转首页...</h3>
</body>
</html>
首页
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h3 style="color:green">欢迎进入首页</h3>
</body>
</html>
web层代码
package com.itheima.web.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.BeanUtils;
import com.itheima.domain.User;
import com.itheima.service.UserService;
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 处理post请求中文乱码问题
request.setCharacterEncoding("utf-8");
// 处理响应的中文乱码问题
response.setContentType("text/html;charset=utf-8");
// 1.创建一个User对象
User user = new User();
// 2.使用BeanUtils封装登录表单提交的数据到user对象
try {
BeanUtils.populate(user, request.getParameterMap());
// 3.调用service层登录方法(其本质是一个查询操作)
UserService service = new UserService();
User exsitUser = service.login(user);
// 4.判断
if (exsitUser != null) {
// 说明登录成功,跳转到登录成功提示信息页面loginSuccess.html
request.getRequestDispatcher("loginSuccess.html").forward(request, response);
} else {
// 说明登录失败,显示错误提示信息
request.setAttribute("msg", "<h3 style='color:red'>用户名或密码错误</h3>");
// 转发
request.getRequestDispatcher("MsgServlet").forward(request, response);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
package com.itheima.web.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MsgServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 处理post请求中文乱码问题
request.setCharacterEncoding("utf-8");
// 处理响应的中文乱码问题
response.setContentType("text/html;charset=utf-8");
// 1.获得request域中的数据
String msg = (String) request.getAttribute("msg");
// 2.响应到浏览器
response.getWriter().write(msg);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
service层代码
package com.itheima.service;
import java.sql.SQLException;
import com.itheima.dao.UserDao;
import com.itheima.domain.User;
public class UserService {
private UserDao dao = new UserDao();
public void register(User user) throws SQLException {
dao.register(user);
}
public User login(User user) throws SQLException {
return dao.login(user);
}
}
dao层代码
package com.itheima.dao;
import java.sql.SQLException;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import com.itheima.domain.User;
import com.itheima.utils.C3P0Utils;
public class UserDao {
public void register(User user) throws SQLException {
// 1.获得QueryRunner核心对象
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
// 2.编写SQL语句
String sql = "insert into user values(null,?,?,?,?)";
// 3.设置实际参数
Object[] params = { user.getUsername(), user.getPassword(), user.getBirthday(), user.getHobby() };
// 4.执行插入操作
qr.update(sql, params);
}
public User login(User user) throws SQLException {
// 1.获得QueryRunner核心对象
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
// 2.编写SQL语句
String sql = "select * from user where username=? and password=?";
// 3.设置实际参数
Object[] params = { user.getUsername(), user.getPassword() };
// 4.执行查询操作
return qr.query(sql, new BeanHandler<>(User.class), params);
}
}