码迷,mamicode.com
首页 > 其他好文 > 详细

Request

时间:2017-09-11 10:11:34      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:where   jdbc工具类   取数   system   java代码   调用   字符   rom   cte   

Request
一、HttpServletRequest
1、HttpServletRequest概述
        我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。
        service方法中的request的类型是ServletRequest,而doGet/doPost方法的request的类型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加强大。
        request对象是JSP中重要的对象,每个request对象封装着一次用户请求,并且所有的请求参数都被封装在request对象中,因此request对象是获取请求参数的重要途径。
2、Request的运行流程
同Response。
 
3、request获得请求内容
请求行
获得客户端的请求方式: String  getMethod();
获得请求的资源: String  getContextPath();---web应用的名称
String getRequestURI()
StringBuffer getRequestURL()
String getContextPath() ---web应用的名称
String getQueryString() ---- get提交url地址后的参数字符串
            //1、获得请求方式
             String method = request.getMethod();
             System.out.println("method:"+method);
             //2、获得请求的资源相关的内容
             String requestURI = request.getRequestURI();
             StringBuffer requestURL = request.getRequestURL();
             System.out.println("uri:"+requestURI);
             System.out.println("url:"+requestURL);
             //获得web应用的名称
             String contextPath = request.getContextPath();
             System.out.println("web应用:"+contextPath);
             //地址后的参数的字符串
             String queryString = request.getQueryString();
             System.out.println(queryString);
             //3、获得客户机的信息---获得访问者IP地址
             String remoteAddr = request.getRemoteAddr();
             System.out.println("IP:"+remoteAddr);
注意:request获得客户机(客户端)的一些信息
request.getRemoteAddr() --- 获得访问的客户端IP地址
 
请求头
获得指定请求头: String  getHeader(String  name);
获取所有请求头的名称:java.util.Enumeration<String> getHeaderNames();
long getDateHeader(String name)
String getHeader(String name)
Enumeration getHeaderNames()
Enumeration getHeaders(String name)
int getIntHeader(String name)
            //1、获得指定的头
             String header = request.getHeader("User-Agent");
             System.out.println(header);
             //2、获得所有的头的名称
             Enumeration<String> headerNames = request.getHeaderNames();
             while(headerNames.hasMoreElements()){
                    String headerName = headerNames.nextElement();
                    String headerValue = request.getHeader(headerName);
                    System.out.println(headerName+":"+headerValue);
             }
 
referer 头的作用:执行该此访问的来源做防盗链
 
请求体
请求体中的内容是通过post提交的请求参数,格式是:
username=zhangsan&password=123&hobby=football&hobby=basketball
key ---------------------- value
username                [zhangsan]
password                [123]
hobby                    [football,basketball]
 
获取paramName请求参数的值:
String getParameter(String paramName);
paramName请求参数的值,当该请求参数有多个值时,该方法将返回多个值所组成的数组:
String[] getParameterValues(String name);
获取所有请求参数名和参数值所组成的Map对象
Map<String,String[]> getParameterMap();
获取所有请求参数名所组成的Enumeration对象
Enumeration getParameterNames();
            //1、获得单个表单值
             String username = request.getParameter("username");
             System.out.println(username);
             String password = request.getParameter("password");
             System.out.println(password);
             //2、获得多个表单的值
             String[] hobbys = request.getParameterValues("hobby");
             for(String hobby:hobbys){
                    System.out.println(hobby);
             }
             //3、获得所有的请求参数的名称
             Enumeration<String> parameterNames = request.getParameterNames();
             while(parameterNames.hasMoreElements()){
                    System.out.println(parameterNames.nextElement());
             }
             System.out.println("------------------");
             //4、获得所有的参数 参数封装到一个Map<String,String[]>
             Map<String, String[]> parameterMap = request.getParameterMap();
             for(Map.Entry<String, String[]> entry:parameterMap.entrySet()){
                    System.out.println(entry.getKey());
                    for(String str:entry.getValue()){
                           System.out.println(str);
                    }
                    System.out.println("---------------------------");
             }
   注:Map复杂了一点,但是比较有用。          
 
注意:不论是get请求方式还是post请求方式,上述的方法一样可以获得。
 
4、Request的其他功能
a、request是一个域对象
request对象也是一个存储数据的区域对象,所以也具有如下方法:
setAttribute(String name, Object o)
getAttribute(String name)
removeAttribute(String name)
 
注意:request域的作用范围:一次请求中
在request中存储数据,然后通过请求转发能够获取到(重定向没有数据)。(a与b结合来看)
 
b、request完成请求转发
获得请求转发器----path是转发的地址
RequestDispatcher getRequestDispatcher(String path)
通过转发器对象转发
requestDispathcer.forward(ServletRequest request, ServletResponse response)
//servlet1将请求转发给servlet2
             RequestDispatcher dispatcher = request.getRequestDispatcher("/servlet2");
             dispatcher.forward(request, response);
注意:转发与重定向的区别?
        1)重定向两次请求,转发一次请求
        2)重定向地址栏的地址变化,转发地址不变
        3)重新定向可以访问外部网站 转发只能访问内部资源
        4)转发的性能要优于重定向
重定向是服务器外部行为,请求转发是服务器内部行为。
 
注意:ServletContext域与Request域的生命周期比较?
        ServletContext:
            创建:服务器启动
            销毁:服务器关闭
            域的作用范围:整个web应用
        request:
            创建:访问时创建request
            销毁:响应结束request销毁
            域的作用范围:一次请求中
 
注意:客户端地址与服务器端地址的写法?
    客户端地址:是客户端去访问服务器的地址,服务器外部的地址。其特点:写上Web应用的名称。
    客户端地址有:直接输入地址;重定向;
 
    服务器端地址:服务器内部资源跳转的地址。其特点:不需要写Web应用的名称。
 
二、完成用户注册
1、获取表单的数据
2、将数据存储到数据库中
 
注意:中文乱码问题;BeanUtils:将Map中的数据映射到实体中(JavaBean),根据map的key与实体的属性进行对比。
 
注册的基本实现:
1、完成登录页面(html or jsp)
2、JDBC工具类实现
jar包:c3po.....dbutils.......mysql-connector....
c3p0-config.xml
DataSourceUtils.java
3、JavaBean实现User(实体数据封装到JavaBean中,数据工整,面向对象思想)
4、注册servlet实现
       //1.获取数据
             //String username = request.getParameter("username");
             //String password = request.getParameter("password");
             
             //2.将散装的数据封装到JavaBean中
             //User user = new User();
             //user.setName(username);
             //user.setPassword(password);             
               //1.2使用BeanUtils进行自动映射封装
             //BeanUtils工作原理:将map中的数据,根据key与实体的属性的对象关系封装
             //只要key的名字与实体的属性的名字一样,就自动封装到实体中
             Map<String, String[]> properties = request.getParameterMap();
             User user = new User();
             try {
                    BeanUtils.populate(user, properties);
             } catch (IllegalAccessException | InvocationTargetException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
             }
             
             //现在这个位置user对象已经封装好了
             //手动封装uid----uuid----随机的不重复的字符串32位
             //java代码生成后是36位
             user.setUid(UUID.randomUUID().toString());           
             response.getWriter().write(user.toString());         
             //3.将参赛传递给一个业务操作方法
             try {
                    regist(user);
                    response.getWriter().write("regist success");               
             } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
             }
注:红色部分需要添加jar包:beanutils   及  loggingjar包
 
解决获取数据的中文乱码问题?
//设置request的编码-----只适合post方式
             request.setCharacterEncoding("UTF-8");
 
乱码过程:王五----使用UTF-8编码------使用iso8859-1解码------乱码xxx,
实现乱码的解决:xxx------使用iso8859-1编码------使用utf-8解码----王五
编码:str.getByte("iso8859-1");
new String(string,"utf-8");
       //get方式乱码解决
             String username = request.getParameter("username");//乱码
             //先用iso8859-1编码,再使用utf-8解码
             username = new String(username.getBytes("iso8859-1"),"UTF-8");
适用于get  post
get不适用于表单提交。
 
用户登录失败的信息回显
 
//4.认为注册成功跳转到登录页面
             //使用重定向,而非转发(地址变化)
             response.sendRedirect(request.getContextPath()+"/login.jsp");
为什么使用request.getContextPath();
 
三、用户登录失败的信息回显
步骤:
1、用户登录
2、输入用户名密码
3、用户名及密码正确,跳转到首页(重定向)
4、用户名或密码不正确
5、转向登录页面,提示用户名或者密码错误
 
技术点:
1、登录页面设计(html  or  jsp)
表单form的action跳转到对应的servelt进行处理。
<form class="form-horizontal" action="/WEB15_Request/login" method="post">
2、LoginServlet.java  (登录处理页面)
//0、设置Request编码
             request.setCharacterEncoding("UTF-8");
             //1.获取用户名和密码
             String username = request.getParameter("username");
             String password = request.getParameter("password");
             //2.调用一个业务方法进行该用户查询
             User login = null;
             try {
                     login = login(username, password);
             } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
             }
             //3.通过user是否为null判断用户名和密码是否正确
             if(login!=null) {
                    //用户名和密码正确
                    //登录成功跳转到网站的首页(重定义)
                    response.sendRedirect(request.getContextPath());                  
             }else {
                    //用户名或密码错误
                    //跳回当前页面login.jsp
                    //使用转发到login.jsp向           
                    request.setAttribute("loginInfo","用户名或密码错误");
                    request.getRequestDispatcher("/login.jsp").forward(request, response);
             }
       }
       
       public User login(String username, String password) throws SQLException {
             QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());
             String sql = "select * from user where username = ? and password = ?";
             User user = runner.query(sql, new BeanHandler<User>(User.class),username,password );
             return user;
       }
3、登录页面错误回显代码 jsp
<div>&nbsp;<%=request.getAttribute("loginInfo")==null?"":request.getAttribute("loginInfo")%></div>
使用三目运算符,如果直接request话,会显示null在登录页面上面。
4、其他,暂无。
 
四、总结
1、request获得行的内容(请求参数)
request.getMethod();
request.getRequestURI();
request.getRequestURL();
request.getContextPath();
request.getRemoteAddr();
 
2、request获得头的内容
request.getHeader(name);
 
3、request获得体(请求参数)
String  request.getParameter(name);
Map<String, String[]> request.getParameterMap();
String[] request.getParametherValues(name);
注意:客户端发送的参数到服务器端获得的值都是字符串。
 
中文乱码问题:
post:
request.setCharacterEncoding("UTF-8");
get(原始方法):
 username = new String(username.getBytes("iso8859-1"),"UTF-8");
 
4、request其他内容 (转发和域)
在域存储数据:
request.setAttribute(name,value);
request.getAtteribute(name);
转发:
request.getRequestDispatcher(转发的地址(服务器内部地址)).forward(request,response);
 
 
 
 
 
 
 
 
 
 
 
 

Request

标签:where   jdbc工具类   取数   system   java代码   调用   字符   rom   cte   

原文地址:http://www.cnblogs.com/scalpel-ct/p/7502986.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!