web_day36_HttpServletRequest

一、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);
	}

}

地址

http://localhost:8080/web_day36/RequesetParamsServlet?username=tom&password=123&hobby=drink&hobby=sleep

结果

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);
	}

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值