zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Less简介及安装
    Less功能特性
    vue相关技术
    Vue+Bootstrap实现购物车程序(3)
    vue的[__ob__: Observer]
    Uncaught TypeError: Cannot assign to read only property 'exports' of object '#<Object>'
    Angular 中的 asyncPipe 源码探究
    Vue Template 修饰符和简写,让开发效率有所提高
    使用 React Testing Library 和 Jest 完成单元测试
    异步堆栈追踪:为什么 await 胜过 Promise?
  • 原文地址:https://www.cnblogs.com/conglingkaishi/p/15256134.html
Copyright © 2011-2022 走看看