02---jsp内置对象02(request对象)

request对象:
 request对象是使用最多的一个对象,其主要作用是接受客户端传来的参数、发送的头信息等,request是
 javax.servlet.http.HttpServletRequest接口的实例化对象,表示此对象主要应用在http协议上;
 
 对应接口:javax.servlet.http.HttpServletRequest extends ServletRequest;

 request_demo01.jsp:
  <%@ page contentType="text/html" pageEncoding="gbk"%>
  <html>
  <head><title>这是测试</title></head>
  <body>
   <form action="request_demo02.jsp" method="post">
    请输入信息:<input type="text" name="info"/><br/>
       <input type="submit" value="提交">
   </form>
  </body>
  </html>

 request_demo02.jsp:
  <%@ page contentType="text/html" pageEncoding="gbk"%>
  <html>
  <head><title>这是测试</title></head>
  <body>
   <%
    String name=request.getParameter("info");
   %>
    <h1>姓名:<%=name%></h1>
  </body>
  </html>

 如上所示:如果输入的信息是中文,则传递过去将会出现乱码;

1、乱码解决:
 由于request接受的是客户端的参数,所以必然有其默认的编码,之所以这样是因为浏览器默认的编码是utf-8,
 而中文的编码是GBK,因为不同统一,所以出现了乱码;
 pageEncoding="UTF-8" 设置jsp编译成.java文件的编码
 contentType="text/html; charset=UTF-8":设置页面编码,告诉浏览器以什么编码来解析文档,以什么编码来发送数据(当请求为get,post);
 request.setCharacterEncoding("UTF-8");设置web服务器对浏览器发送的请求数据的编码(默认是IS08859-1);
 response.setCharacterEncoding("UTF-8");设置web服务器给浏览器发送的回复数据的编码(默认是IS08859-1);
 
 解决乱码就得通过jsp提供的统一设置编码的方法---request.setCharacterEncoding("gbk");;
 
 request_demo01.jsp:
  <%@ page contentType="text/html;charset=gbk" pageEncoding="gbk"%>
  <html>
  <head><title>这是测试</title></head>
  <body>
   <form action="request_demo02.jsp" method="post">
    请输入信息:<input type="text" name="info"/><br/>
       <input type="submit" value="提交">
   </form>
  </body>
  </html>

 request_demo02.jsp:
  <%@ page contentType="text/html" pageEncoding="gbk"%>
  <html>
  <head><title>这是测试</title></head>
  <body>
   <%
    request.setCharacterEncoding("gbk");
    String name=request.getParameter("info");
   %>
    <h1>姓名:<%=name%></h1>
    <%=request.getCharacterEncoding()%>
  </body>
  </html>
 以后只要进行传递,则肯定要使用这条语句进行乱码解决的;
 如果这种乱码解决不了,还有第二种方法:
  String name=new String(request.getParameter("info").getBytes("ISO8859-1"));

2、接收参数:
 request_demo01.jsp:
  <%@ page contentType="text/html;charset=gbk" pageEncoding="gbk"%>
  <html>
  <head><title>这是测试</title></head>
  <body>
   <form action="request_demo02.jsp" method="post">
    姓名:<input type="text" name="uname"/><br/>
    兴趣:<input type="checkbox" name="inst" value="唱歌">唱歌
       <input type="checkbox" name="inst" value="跳舞">跳舞
       <input type="checkbox" name="inst" value="游泳">游泳
       <input type="checkbox" name="inst" value="看书">看书
       <input type="checkbox" name="inst" value="旅游">旅游
    <br><input type="hidden" name="id" value="3"/>
    <input type="submit" value="提交"/>
    <input type="reset" value="重置"/>
   </form>
  </body>
  </html>

 request_demo02.jsp:
  <%@ page contentType="text/html" pageEncoding="gbk"%>
  <html>
  <head><title>这是测试</title></head>
  <body>
   <%
    request.setCharacterEncoding("gbk");
    String id=request.getParameter("id");
    String uname=request.getParameter("uname");
    String inst[]=request.getParameterValues("inst");
   %>
    兴趣:
   <%
    if(inst!=null){//避免为空
     for(int i=0;i<inst.length;i++){
   %>
      <%=inst[i]%>
   <%
     }
    }
   %>
    <h1>姓名:<%=uname%></h1>
    
  </body>
  </html>

3、URL地址重写:
 在web开发中,所有的参数不一定都是由表单传递的,也可以使用地址重写的方式进行传递,地址重写的
 格式如下:
  动态页面地址:?参数名称1=参数内容&参数名称2=参数内容
  request_demo02.jsp
   <%@ page contentType="text/html" pageEncoding="gbk"%>
   <html>
   <head><title>这是测试</title></head>
   <body>
    <%
     request.setCharacterEncoding("gbk");
     String uname=request.getParameter("name");
     String password=request.getParameter("password");
    %>
     <h1>姓名:<%=uname%></h1>
     <h1>密码:<%=password%></h1>
     
   </body>
   </html>

  直接打开request_demo02.jsp网页时姓名和密码为空,但是可以重写url如下:
  
http://localhost/lid/request/request_demo02.jsp?name=lid&password=123

4、表单提交的两种方式:get和post
 post提交:提交后的地址栏不会再目标地址后面附加其他内容;
 get提交:提交后的地址栏会发生变化,而且会是由URL地址重写的方式完成,并且决定会受到地址栏长度的影响;

 在request中还有一个很重要的方法:
  Enumeration getParameterNames()
 从名字可以看出是返回说有参数的名字;
 
 request_demo01.jsp
  <%@ page contentType="text/html;charset=gbk" pageEncoding="gbk"%>
  <html>
  <head><title>这是测试</title></head>
  <body>
   <form action="request_demo02.jsp" method="post">
    姓名:<input type="text" name="uname"/><br/>
    性别:<input type="radio" name="sex" Checked/>男
       <input type="radio" name="sex" />女<br/>
    城市:<select name="city">
        <option value="北京">北京</option>
      <option value="天津">天津</option>
      <option value="洛阳">洛阳</option>
       </select><br/>
    兴趣:<input type="checkbox" name="inst" value="唱歌">唱歌
       <input type="checkbox" name="inst" value="跳舞">跳舞
       <input type="checkbox" name="inst" value="书法">书法
       <input type="checkbox" name="inst" value="摄影">摄影<br/>
    自我介绍:<textarea cols="30" rows="3" name="notes"></textarea><br/>
    <input type="hidden" name="uid" value="1">
    <input type="submit" value="提交"/>
    <input type="reset" value="重置"/>
   </form>
  </body>
  </html>
 如果按照以前的方式,接受不同参数用request.getParameter("param"),而所有的数组内容则用request.getParameterValues()接受;
 现在我们用request.getParameterNames()接受:
 request_demo01.jsp
  <%@ page contentType="text/html;charset=gbk" pageEncoding="gbk"%>
  <html>
  <head><title>这是测试</title></head>
  <body>
   <form action="request_demo02.jsp" method="post">
    姓名:<input type="text" name="uname"/><br/>
    性别:<input type="radio" name="sex" value="男" Checked/>男
       <input type="radio" name="sex" value="女"/>女<br/>
    城市:<select name="city">
        <option value="北京">北京</option>
      <option value="天津">天津</option>
      <option value="洛阳">洛阳</option>
       </select><br/>
    兴趣:<input type="checkbox" name="inst" value="唱歌">唱歌
       <input type="checkbox" name="inst" value="跳舞">跳舞
       <input type="checkbox" name="inst" value="书法">书法
       <input type="checkbox" name="inst" value="摄影">摄影<br/>
    自我介绍:<textarea cols="30" rows="3" name="notes"></textarea><br/>
    <input type="hidden" name="uid" value="1">
    <input type="submit" value="提交"/>
    <input type="reset" value="重置"/>
   </form>
  </body>
  </html>

 request_demo02.jsp
  <%@ page contentType="text/html" pageEncoding="gbk"%>
  <%@ page import="java.util.*"%>
  <html>
  <head><title>这是测试</title></head>
  <body>
   <%
    request.setCharacterEncoding("gbk");//设置统一编码
    //取得所有参数
    Enumeration enu=request.getParameterNames();
   %>
    <table border="1">
     <tr>
      <td>参数</td>
      <td>数值</td>
     </tr>
     <%
      while(enu.hasMoreElements())
      {
       String paramName=(String)enu.nextElement();
     %>
      <tr>
       <td><%=paramName%></td>
       <td>
        <%
         //如有以**开头则是数组类型的
         if(paramName.startsWith("**")){
          String str[]=request.getParameterValues(paramName);
           for(int i=0;i<str.length;i++){
        %>
            <%=str[i]%>
        <%
           }
          }
         else{
        %>
            <%=request.getParameter(paramName)%>
        <%
          }
        %>
       </td>
      </tr>
     <%
      }
     %>
    </table>
   </body>
  </html>

5、显示头信息:
 java的web的开发使用的是http协议,主要的操作就是基于请求和相应,但是在请求和相应的同时还会包含
 其他信息(客户端的ip,cookie、语言等),那这些信息叫做头信息;
 
 要想获得这些通信息的名称可以直接通过request内置对象的getHeaderNames(),而要想获得每个头信息的内容,
 则使用getHeader()方法;
  <%@ page contentType="text/html" pageEncoding="gbk"%>
  <%@ page import="java.util.*" %>
  <html>
  <head><title>这是测试</title></head>
  <body>
   <%
    Enumeration enu=request.getHeaderNames();
    while(enu.hasMoreElements()){
     String headerName=(String)enu.nextElement();
     String headerValue=request.getHeader(headerName);
     
   %>
    <h3><%=headerName%>---><%=headerValue%></h3>
    <%
     }
    %>
   </body>
  </html>

6、角色验证:
 tomcat安装的时候设置过用户名和密码:
 验证框可以通过程序实现,如果要实现,则使用方法:boolean isUserInRole(String role)
 这种验证实际上就是相当于是在tomcat上增加了些新的用户而已,如果要想增加用户修改配置文件conf/tomcat-users.xml
  <role rolename="manager"/>
  <role rolename="admin"/>
  <user name="admin" password="admin" roles="manager-gui" />
  <user name="lid" password="123" roles="admin,manager" />
  <user name="yuj" password="123" roles="admin" />
 配置完成之后,重新启动服务器,
 配置完成之后还需要配置WEB-INF/web.xml文件.
  <security-constraint>  
    <web-resource-collection>
     <web-resource-name>RegisteredUsers</web-resource-name>
     <url-pattern>/request/request_demo02.jsp</url-pattern>
    </web-resource-collection>
    <auth-constraint>
     <role-name>admin</role-name>
     <role-name>manager</role-name>
    </auth-constraint>
   </security-constraint>
   <login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>Registered Users</realm-name>
   </login-config>
  <security-role>
   <role-name>admin</role-name>
  </security-role>
  <security-role>
   <role-name>manager</role-name>
  </security-role>
 下面编写角色的验证操作:
  即在demo01.jsp中写如下语句:
   <%
    if(request.isUserInRole("admin")){
   %>
    <h2>欢迎光临</h2>
   <%  
         }
   %>
 


7、其他操作:
 通过request对象可以取得客户端的IP地址、请求方式、访问的路径、上下文的名称等等;
  <%
   String method=request.getMethod();//得到请求的方式
   String ip=request.getRemoteAddr();//得到请求的ip
   String path=request.getServletPath();//得到访问路径
   String contextPath=request.getContextPath();//得到上下文路径
  %>
   <h3>请求方式:<%=method%></h3>
   <h3>请求IP:<%=ip%></h3>
   <h3>访问路径:<%=path%></h3>
   <h3>上下文路径:<%=contextPath%></h3>

  request.getContextPath()在以后的开发中非常重要可以解决跳转路径问题;

你可能感兴趣的:(02---jsp内置对象02(request对象))