Servlet Request对象

Request

一、Request对象

1)Request理解

request 是请求对象,主要用于获取从浏览器传送给服务器之间的一些数据
request是由tomcat创建的,Servlet是由容器启动时,创建Servlet
request对象是来获取请求信息的

2) Request的作用

接收客户端的请求,获取请求中的信息。除了可以获取请求中携带的数据之外,还可以获取比如主机地址、端口、请求方式、项目名称等一系列信息。
请求分类:
请求行、请求头、请求体。

1. 获取请求行数据(了解)

请求行中,我们可以通过request对象的相应方法获取到比如协议名、服务名、端口号、项目名称、请求方式、参数列表等信息。

获取请求行数据的方法

方法名 描述
getScheme() 协议名
getServerName() 服务器名
getServerPort() 端口号
getContextPath() 项目名
getMethod() 请求方式
queryString 参数字符串
getRequestURL() 完整请求url

页面实现:

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Title</title>
</head>
<body>



<a href="requestLine?username=jack&password=123&age=12">测试请求行</a>
</body>
</html>

案例实现:

package com.offcn.web;

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;

@WebServlet("/requestLine")
public class RequestLineServlet extends HttpServlet {

   @Override
   protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //协议
       String scheme = req.getScheme();
       System.out.println("协议:"+scheme);
       //主机地址
       String serverName = req.getServerName();
       System.out.println("主机:"+serverName);
       //端口号
       int port = req.getServerPort();
       System.out.println("端口号:"+port);
       //项目名
       String contextPath = req.getContextPath();
       System.out.println("项目名:"+contextPath);
       //请求路径
       String requestURI = req.getRequestURI();
       System.out.println("请求路径:"+requestURI);
       //参数
       String queryString = req.getQueryString();
       System.out.println("携带参数:"+queryString);
       //请求方式
       String method = req.getMethod();
       System.out.println("请求方式:"+method);
       //完整url
       StringBuffer requestURL = req.getRequestURL();
       System.out.println("完整地址:"+requestURL.toString());
   }
}

实现效果:

image

2. 获取请求头数据(了解)

请求头是当前对用户发送的数据的描述信息。
请求头信息在请求的时候不需要程序员手动添加,是浏览器发送的时候已经处理好的。
如果想查看请求头信息,也可以在Servlet中通过getHeader方法获取。

获取请求头数据的方法:

方法名 描述
String getHeader(String name) 根据请求头的名称获取请求头信息(单个)
Enumeration getHeaderNames() 返回此请求包含的所有头名称的枚举(多个)

案例实现:

package com.ujiuye.servlet;

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.util.Enumeration;

@WebServlet("/requestHeader")
public class RequestHeaderServlet extends HttpServlet {
   @Override
   protected void service(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
       // 通过请求头关键字获取值
       String header = request.getHeader("host");
       System.out.println(header);
       System.out.println("=================================================");
       // 读取所有请求头信息
       Enumeration<String> headerNames = request.getHeaderNames();
       while (headerNames.hasMoreElements()) {
           String key = (String) headerNames.nextElement();
           System.out.println(key + ":" + request.getHeader(key));
       }
   }
}

实现效果:

image

3. 获取请求正文数据(请求体)

①获取请求参数
请求体就是请求中携带的数据,也就是我们需要获取的参数。

获取请求参数的方法:

方法名 描述
String getParameter(String name) 根据参数名获取参数值
String[] getParameterValues(String name) 根据参数名获取参数值(可以是多个值)
Enumeration getPatameterNames() 获取所有的参数名
Map<String,String[]> getParameterMap() (项目中使用) 获取所有参数的map集合

页面实现:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="requestBody" method="get">
		<p>
			用户名:
			<input name="username" type="text">
		</p>
		<p>
			密码:
			<input name="password" type="password">
		</p>
		<p>
			性别: 
			<input name="sex" type="radio" value="男" checked="checked">男
			<input name="sex" type="radio" value="女">女
		</p>
		<p>
			爱好: 
				<input name="hobby" type="checkbox" value="唱歌">唱歌 
				<input name="hobby" type="checkbox" value="跳舞">跳舞
				<input name="hobby" type="checkbox" value="上网">上网 
				<input name="hobby" type="checkbox" value="跑步">跑步
		</p>
		<p>
			地址: 
			<select name="address">
				<option value="北京">北京</option>
				<option value="天津">天津</option>
				<option value="上海">上海</option>
			</select>
		</p>
		<p>
			个人简介:<br>
			<textarea name="introduce" rows="4" cols="40"></textarea>
		</p>
		<p>
			<input type="submit" value="提交"> 
			<input type="reset" value="取消">
		</p>
	</form>
</body>
</html>

案例实现1:

package com.ujiuye.request;

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;

@WebServlet("/requestBody")
public class RequestBodyServlet extends HttpServlet {

	public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//解决乱码
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		//获取用户提交的信息
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		String sex = request.getParameter("sex");
		String[] hobbies = request.getParameterValues("hobby");
		String address = request.getParameter("address");
		String introduce = request.getParameter("introduce");
		//响应到页面展示
		PrintWriter writer = response.getWriter();//响应输出流(servlet自带的流)
		writer.println("用户名: " + username + "<br>"); 
		writer.println("密码: " + password + "<br>"); 
		writer.println("性别: " + sex + "<br>"); 
		writer.println("爱好: " + Arrays.toString(hobbies) + "<br>"); 
		writer.println("地址: " + address + "<br>"); 
		writer.println("个人简介: " + introduce + "<br>");

		System.out.println("============================");
		//控制台或者页面
		Enumeration<String> parameterNames = request.getParameterNames();
		while (parameterNames.hasMoreElements()) {
			String name = (String) parameterNames.nextElement();
			String[] values = request.getParameterValues(name);
			System.out.println(name + " ==> " + Arrays.toString(values));
		}
	}
}

页面实现效果:

image-20210204151329061

控制台展示效果:

image-20210204151404866

案例实现2:

package com.ujiuye.request;

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.util.Arrays;
import java.util.Map;
import java.util.Set;

@WebServlet("/requestBody2")
public class RequestBodyServlet2 extends HttpServlet {

	public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//解决乱码
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		//获取用户提交的信息
		Map<String, String[]> map = request.getParameterMap();
		//获取所有key
		Set<String> keys = map.keySet();
		//遍历出每一个key
		for (String key : keys) {
			System.out.println(key + " ==> " + Arrays.toString(map.get(key)));
		}

	}
}

实现效果:

image

②中文乱码

Get:
默认编码编码类型是:application/x-www-form-urlencoded;Tomcat8之前的版本,默认编码格式是iso-8859-1,从Tomcat8版本之后默认编码改为UTF-8,所以如果是Tomcat8及以上版本就不需要进行转码处理,如果是Tomcat7及之前版本可以使用以下方法进行转码:
String name = request.getParameter("name");
String encodingName=new String(name.getBytes("iso-8859-1"),"utf-8");
Post:
支持多种编码类型,application/x-www-form-urlencoded 或 multipart/form-data。可以使用以下方法进行转码:
request.setCharacterEncoding("utf-8");
在这里顺便说一下响应的乱码处理方法,后面我们还会详细讲解:
response.setContentType("text/html;charset=utf-8");

页码实现:

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Title</title>
</head>
<body>
   <h2>get请求</h2>
   <form action="encoding" method="get">
       <p>
           账号: <input type="text" name="username">
       </p>
       <p>
           密码: <input type="password" name="password">
       </p>
       <p>
           <input type="submit" value="登录">
       </p>
   </form>

   <hr>

   <h2>post请求</h2>
   <form action="encoding" method="post">
       <p>
           账号: <input type="text" name="username">
       </p>
       <p>
           密码: <input type="password" name="password">
       </p>
       <p>
           <input type="submit" value="登录">
       </p>
   </form>
</body>
</html>

案例实现:

package com.ujiuye.request;

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;

@WebServlet("/encoding")
public class EncodingServlet extends HttpServlet {
   @Override
   protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       //处理请求的乱码
       request.setCharacterEncoding("utf-8");
       //解决响应乱码问题
       response.setContentType("text/html;charset=utf-8");
       //获取用户输入的内容
       String username = request.getParameter("username");
       String password = request.getParameter("password");
       System.out.println("账号为: " + username + " ==> 密码为: " + password);
       //响应   将登录成功展示页面
       response.getWriter().write("登录成功");
   }
}

4. 域对象:共享数据

域对象:有作用域的对象就是域对象。域对象可以用来存值并在不同组件之间进行传递,域对象限制了数据的访问范围,其值会随着对象的消失而消失。
Servlet中提供了两个域对象:

  1. request 作用域的值是在一次请求范围内有效(周期短)。
  2. ServletContext是一个全局作用域对象,在整个Web应用内都有效(周期长)。

常用方法:

方法名 描述
void setAttribute(String name,Object obj) 向作用域中存储数据
Object getAttribute(String name) 从作用域中获取数据
void removeAttribute(String name) 从作用域中移除数据

request作用域:

package com.ujiuye.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;

@WebServlet("/requestScope")
public class RequestScope extends HttpServlet {

   @Override
   protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       //向request作用域中存储数据
       request.setAttribute("name", "liuyan");
       //从作用域中获取liuyan
       String name = (String) request.getAttribute("name");
       System.out.println(name);
       //移除作用域中数据
		request.removeAttribute("name");
		//再次获取liuyan
		name = (String) request.getAttribute("name");
		System.out.println(name);
   }
}

5. 请求转发

① 理解

一种在服务器内部资源跳转的方式。浏览器请求ServletA资源时,ServletA资源不足或者没有资源,ServletA请求其他的资源然后响应给浏览器,这个过程叫转发;

② 实现

案例:在AServlet中向request作用域中保存信息并以转发的方式跳转到BServlet

案例实现:

Aservlet:

package com.offcn.web;

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;

@WebServlet("/AServlet")
public class AServlet extends HttpServlet {

   @Override
   protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       String name = "jack";
       //存值
       req.setAttribute("username",name);
       //内部转发到BServlet
       req.getRequestDispatcher("BServlet").forward(req,resp);
   }
}

BServlet:

package com.offcn.web;

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;

@WebServlet("/BServlet")
public class BServlet extends HttpServlet {

   @Override
   protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //获取ASerevlet中的变量 name
       Object username = req.getAttribute("username");
       System.out.println(username);
   }
}

③ 特点
   1. 转发发生在服务器内部
   2. 转发的过程中url地址不变 浏览器不知道
   3. 转发可以访问到 WEB-INF 中的资源
   4. 转发的路径是当前项目下 因此转发不可以访问项目以外的资源
   5. 转发的路径一般是相对路径
   6. 转发发生一次请求中

3) 案例 : 用户注册

1、创建用户表

#创建用户表
CREATE TABLE user (
uid INT PRIMARY KEY AUTO_INCREMENT,#用户编号
username VARCHAR(50),#用户名
password VARCHAR(50),#密码
name VARCHAR(30),#真实姓名
telephone VARCHAR(11),#手机号
birthday DATE #出生日期
);

2、创建用户表对应的实体类User

package com.offcn.entity;

import java.util.Date;

public class User {

   private int uid;
   private String username;
   private String password;
   private String name;
   private String telephone;
   private Date birthday;

   public User(int uid, String username, String password, String name, String telephone, Date birthday) {
       this.uid = uid;
       this.username = username;
       this.password = password;
       this.name = name;
       this.telephone = telephone;
       this.birthday = birthday;
   }

   public User(String username, String password, String name, String telephone, Date birthday) {
       this.username = username;
       this.password = password;
       this.name = name;
       this.telephone = telephone;
       this.birthday = birthday;
   }

   public User(){}

   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 getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public String getTelephone() {
       return telephone;
   }

   public void setTelephone(String telephone) {
       this.telephone = telephone;
   }

   public Date getBirthday() {
       return birthday;
   }

   public void setBirthday(Date birthday) {
       this.birthday = birthday;
   }
}

3、页面实现

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>注册页面</title>
</head>
<body>
<form id="form" action="regist" method="post">
   <table border="1" cellspacing="0" width="500" height="300" align="center">
       <caption>
           <h2>用户注册</h2>
       </caption>
       <tr>
           <td align="right">用户名:</td>
           <td><input type="text" name="username" placeholder="请输入用户名" /></td>
       </tr>
       <tr>
           <td align="right">密码:</td>
           <td><input type="password" name="password" placeholder="请输入密码" /></td>
       </tr>
       <tr>
           <td align="right">姓名:</td>
           <td><input type="text" name="name" placeholder="请输入姓名" /></td>
       </tr>
       <tr>
           <td align="right">手机号:</td>
           <td><input type="text" name="telephone" placeholder="请输入手机号" /></td>
       </tr>
       <tr>
           <td align="right">出生日期:</td>
           <td><input type="text" name="birthday" placeholder="请输入出生日期" /></td>
       </tr>
       <tr>
           <td align="center" colspan="2"><input type="submit" value="注册"/></td>
       </tr>
   </table>
</form>
</body>
</html>

页面效果:

image-20210205160608151

4、案例实现:

RegistServlet

package com.offcn.web;

import com.offcn.dao.UserDao;
import com.offcn.entity.User;

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.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

@WebServlet("/regist")
public class RegistServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String name = req.getParameter("name");
        String telephone = req.getParameter("telephone");
        String birthday = req.getParameter("birthday");
        //把5个参数值封装到 javaBean中
        //时间转换成Date类型 SimpleDateFormate
        Date date = null;
        try {
            date =  new SimpleDateFormat("yyyy-MM-dd").parse(birthday);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        User user = new User(username,password,name,telephone,date);
        UserDao userDao = new UserDao();
        int i = userDao.addUser(user);
        System.out.println(i>0?"注册成功":"注册失败");
    }
}

UserDao

package com.offcn.dao;

import com.mysql.jdbc.JDBC4Connection;
import com.offcn.entity.User;
import com.offcn.util.BaseDao;
import com.offcn.util.JdbcUtils;

public class UserDao extends BaseDao<User> {

    //注册
    public int addUser(User user){
        return   update(JdbcUtils.getConnection(),"insert into user values(null,?,?,?,?,?)",
                    user.getUsername(),user.getPassword(),user.getName(),user.getTelephone(),user.getBirthday());
    }
}

导入连接数据库的工具、配置文件

BaseDao、JdbcUtils、c3p0-config.xml

jar包需要放在web-inf下,否则在服务器上运行不了.

image

原文地址:https://www.cnblogs.com/conglingkaishi/p/15256134.html