• JavaWeb的学习--HttpServletRequest


    1.HttpServletRequest概述

    我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。

    service方法中的request的类型是ServletRequest,而doGet/doPost方法的request的类型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加强大.

    2.request的运行流程


    3.通过抓包工具抓取Http请求


    因为request代表请求,所以我们可以通过该对象分别获得Http请求的请求行,请 求头和请求体

    4.通过request获得请求行

    获得客户端的请求方式:String getMethod()

    获得请求的资源:

      String getRequestURI()

      StringBuffer getRequestURL()

      String getContextPath() ---web应用的名称

      String getQueryString() ---- get提交url地址后的参数字符串

      username=zhangsan&password=123

     

    注意:request获得客户机(客户端)的一些信息

      request.getRemoteAddr() --- 获得访问的客户端IP地址

    5.通过request获得请求头

      long getDateHeader(String name)

      String getHeader(String name)

      Enumeration getHeaderNames()

      Enumeration getHeaders(String name)

      int getIntHeader(String name)

     

      referer头的作用:执行该此访问的的来源

      做防盗链

    6.通过request获得请求体

    请求体中的内容是通过post提交的请求参数,格式是:

    username=zhangsan&password=123&hobby=football&hobby=basketball

    key ---------------------- value

    username                    [zhangsan]

    password                     [123]

    hobby                          [football,basketball]

                           

    以上面参数为例,通过一下方法获得请求参数:

    String getParameter(String name)

    String[] getParameterValues(String name)

    Enumeration getParameterNames()

    Map<String,String[]> getParameterMap()

      

          注意:get请求方式的请求参数 上述的方法一样可以获得

     

          解决post提交方式的乱码:request.setCharacterEncoding("UTF-8");

          解决get提交的方式的乱码:

                parameter = new String(parameter.getbytes("iso8859-1"),"utf-8");

     

    7.request的其他功能

    (1)request是一个域对象

    request对象也是一个存储数据的区域对象,所以也具有如下方法:

      setAttribute(String name, Object o)

      getAttribute(String name)

      removeAttribute(String name)

     

    注意:request域的作用范围:一次请求中

    (2)request完成请求转发

    获得请求转发器----path是转发的地址

      RequestDispatcher getRequestDispatcher(String path)

    通过转发器对象转发

      requestDispathcer.forward(ServletRequest request, ServletResponse response) 

        

     

    注意:ServletContext域与Request域的生命周期比较?

     ServletContext

           创建:服务器启动

           销毁:服务器关闭

       域的作用范围:整个web应用

     request

         创建:访问时创建request

      销毁:响应结束request销毁

      域的作用范围:一次请求中

    注意:转发与重定向的区别?

       1)重定向两次请求,转发一次请求

       2)重定向地址栏的地址变化,转发地址不变

       3)重新定向可以访问外部网站 转发只能访问内部资源

       4)转发的性能要优于重定向

     

    注意:客户端地址与服务器端地址的写法?

             客户端地址:

        是客户端去访问服务器的地址,服务器外部的地址,特点:写上web应用名

        直接输入地址:

                 重定向

       服务器端地址:

         服务器内部资源的跳转的地址,特点:不需要写web应用的名称

         转发

    案例:注册功能的实现

    1. 案例分析:

     

    2. 案例实现:

    1)注册表单html

     1 <form class="form-horizontal" style="margin-top: 5px;" action="/WEB09/register" method="post">
     2                     <div class="form-group">
     3                         <label for="username" class="col-sm-2 control-label">用户名</label>
     4                         <div class="col-sm-6">
     5                             <input type="text" class="form-control" id="username" name="username"
     6                                 placeholder="请输入用户名">
     7                         </div>
     8                     </div>
     9                     <div class="form-group">
    10                         <label for="inputPassword3" class="col-sm-2 control-label">密码</label>
    11                         <div class="col-sm-6">
    12                             <input type="password" class="form-control" id="inputPassword3" name="password"
    13                                 placeholder="请输入密码">
    14                         </div>
    15                     </div>
    16                     <div class="form-group">
    17                         <label for="confirmpwd" class="col-sm-2 control-label">确认密码</label>
    18                         <div class="col-sm-6">
    19                             <input type="password" class="form-control" id="confirmpwd"
    20                                 placeholder="请输入确认密码">
    21                         </div>
    22                     </div>
    23                     <div class="form-group">
    24                         <label for="inputEmail3" class="col-sm-2 control-label">Email</label>
    25                         <div class="col-sm-6">
    26                             <input type="email" class="form-control" id="inputEmail3" name="email"
    27                                 placeholder="Email">
    28                         </div>
    29                     </div>
    30                     <div class="form-group">
    31                         <label for="usercaption" class="col-sm-2 control-label">姓名</label>
    32                         <div class="col-sm-6">
    33                             <input type="text" class="form-control" id="usercaption" name="name"
    34                                 placeholder="请输入姓名">
    35                         </div>
    36                     </div>
    37                     <div class="form-group opt">
    38                         <label for="inlineRadio1" class="col-sm-2 control-label">性别</label>
    39                         <div class="col-sm-6">
    40                             <label class="radio-inline"> <input type="radio"
    41                                 name="sex" id="inlineRadio1" value="male">
    42 43                             </label> <label class="radio-inline"> <input type="radio"
    44                                 name="sex" id="inlineRadio2" value="female">
    45 46                             </label>
    47                         </div>
    48                     </div>
    49                     <div class="form-group">
    50                         <label for="date" class="col-sm-2 control-label">出生日期</label>
    51                         <div class="col-sm-6">
    52                             <input type="date" class="form-control" name="birthday">
    53                         </div>
    54                     </div>
    55 
    56                     <div class="form-group">
    57                         <label for="date" class="col-sm-2 control-label">验证码</label>
    58                         <div class="col-sm-3">
    59                             <input type="text" class="form-control">
    60 
    61                         </div>
    62                         <div class="col-sm-2">
    63                             <img src="./image/captcha.jhtml" />
    64                         </div>
    65 
    66                     </div>
    67 
    68                     <div class="form-group">
    69                         <div class="col-sm-offset-2 col-sm-10">
    70                             <input type="submit" width="100" value="注册" name="submit"
    71                                 style="background: url('./images/register.gif') no-repeat scroll 0 0 rgba(0, 0, 0, 0); height: 35px;  100px; color: white;">
    72                         </div>
    73                     </div>
    74                 </form>

    2)RegisterServlet  配置的虚拟路径为  /register

     1 /**
     2  * 用户注册
     3  * @author vanguard
     4  *
     5  */
     6 public class RegisterServlet extends HttpServlet {
     7 
     8     public void doGet(HttpServletRequest request, HttpServletResponse response)
     9             throws ServletException, IOException {
    10         //解决中文乱码问题
    11         //1. post方式 设置request的编码方式
    12         request.setCharacterEncoding("UTF-8");
    13         //2. get方式
    14 //        String name = request.getParameter("name");
    15 //        name = new String(name.getBytes("ISO8859-1"), "UTF-8");
    16         
    17         //1. 获取表单的数据
    18         Map<String, String[]> parameterMap = request.getParameterMap();
    19         User user = new User();
    20         //2. 将获得的数据封装成JavaBean对象
    21         try {
    22             BeanUtils.populate(user, parameterMap);
    23         } catch (IllegalAccessException | InvocationTargetException e) {
    24             e.printStackTrace();
    25         }
    26         //3. 设置uid的值
    27         user.setUid(UUID.randomUUID().toString());
    28         
    29         //4. 调用方法,将获取的数据添加到user表中
    30         try {
    31             register(user);
    32         } catch (SQLException e) {
    33             
    34             e.printStackTrace();
    35         }
    36         
    37         //注册成功后,重定向到登录界面
    38         response.sendRedirect(request.getContextPath() + "login.jsp");
    39     }
    40     
    41     /**
    42      * 注册用户的方法
    43      * @param user
    44      * @throws SQLException
    45      */
    46     public void register(User user) throws SQLException {
    47         //创建QueryRunner对象
    48         QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
    49         //定义sql语句
    50         String sql = "insert into user values(?,?,?,?,?,?,?,?,?,?)";
    51         Object[] params = {user.getUid(), user.getUsername(), user.getPassword(),
    52                 user.getName(), user.getEmail(), null, user.getBirthday(), user.getSex(), null, null};
    53         //执行添加操作
    54         qr.update(sql, params);
    55     }
    56 
    57     public void doPost(HttpServletRequest request, HttpServletResponse response)
    58             throws ServletException, IOException {
    59         doGet(request, response);
    60 
    61     }
    62 
    63 }

    3)User.java 

     1 public class User {
     2     private String uid;
     3     private String username;
     4     private String password;
     5     private String name;
     6     private String email;
     7     private String sex;
     8     private String birthday;
     9     
    10     public User() {
    11         super();
    12         
    13     }
    14 
    15     public User(String uid, String username, String password, String name,
    16             String email, String sex, String birthday) {
    17         super();
    18         this.uid = uid;
    19         this.username = username;
    20         this.password = password;
    21         this.name = name;
    22         this.email = email;
    23         this.sex = sex;
    24         this.birthday = birthday;
    25     }
    26 
    27     public String getUid() {
    28         return uid;
    29     }
    30 
    31     public void setUid(String uid) {
    32         this.uid = uid;
    33     }
    34 
    35     public String getUsername() {
    36         return username;
    37     }
    38 
    39     public void setUsername(String username) {
    40         this.username = username;
    41     }
    42 
    43     public String getPassword() {
    44         return password;
    45     }
    46 
    47     public void setPassword(String password) {
    48         this.password = password;
    49     }
    50 
    51     public String getName() {
    52         return name;
    53     }
    54 
    55     public void setName(String name) {
    56         this.name = name;
    57     }
    58 
    59     public String getEmail() {
    60         return email;
    61     }
    62 
    63     public void setEmail(String email) {
    64         this.email = email;
    65     }
    66 
    67     public String getSex() {
    68         return sex;
    69     }
    70 
    71     public void setSex(String sex) {
    72         this.sex = sex;
    73     }
    74 
    75     public String getBirthday() {
    76         return birthday;
    77     }
    78 
    79     public void setBirthday(String birthday) {
    80         this.birthday = birthday;
    81     }
    82 
    83     @Override
    84     public String toString() {
    85         return "User [uid=" + uid + ", username=" + username + ", password="
    86                 + password + ", name=" + name + ", email=" + email + ", sex="
    87                 + sex + ", birthday=" + birthday + "]";
    88     }
    89     
    90 }
  • 相关阅读:
    让PHP程序永远在后台运行
    discuz3.2x增加邮箱验证功能
    UML类图几种关系的总结
    UML中九种图的理解
    什么是UML类图
    仿了么项目,商品详情页开发
    仿饿了么项目,右侧商品组件动画,以及和购物车组件的联动效果,小球掉落效果
    外卖项目底部购物车组件编写
    仿饿了么外卖项目better-scroll插件的实战
    vue项目如何在手机上测试
  • 原文地址:https://www.cnblogs.com/guodong-wang/p/7301612.html
Copyright © 2020-2023  润新知