request对象

来源:互联网 发布:杜克大学商学院知乎 编辑:程序博客网 时间:2024/06/04 17:02

request

HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。

产生时间:当一个请求到达服务端的时候,服务器自动创建了该对象

灭亡时间:作为doGet方法的形参,该方法执行完后该对象就死亡了。

延长其生命:请求转发

 request也是一个域对象

void setAttribute(key,vlaue) ;

Object getAttribute(key) ;

void removeAttribute(key) ;


1.字段    

字段:作为一个域模型的时候会用到:

通过服务端的验证机制,实现弹出一个框,输入用户名和密码才能进入的功能,而不是在页面上进行验证。

四种认证:


2.常用方法

getRequestURL方法返回客户端发出请求时的完整URL。
getRequestURI方法返回请求行中的资源名部分。
getQueryString方法返回请求行中的参数部分。
getRemoteAddr方法返回发出请求的客户机的IP地址
getRemoteHost方法返回发出请求的客户机的完整主机名
getRemotePort方法返回客户机所使用的网络端口号
getLocalAddr方法返回WEB服务器的IP地址。
getLocalName方法返回WEB服务器的主机名
getMethod得到客户机请求方式
getContextPath()得到工程路径


Uri:工程路径+资源地址

URL:协议+服务器名+端口号+工程路径+资源地址+请求参数

3.应用

1.获取客户机信息

package com.heima.request;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//演示request的常用方法public class ServletRequest1 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=utf-8") ;PrintWriter out = response.getWriter() ;//常用方法String url = request.getRequestURL().toString() ;  //协议+ 服务器地址 + 端口号+ 工程名称 + 资源地址 + 参数String uri = request.getRequestURI() ;  // 工程名称+ 资源地址String contextpath = request.getContextPath() ; // 工程名称String encoding = request.getCharacterEncoding() ;String localIp = request.getLocalAddr() ;  //服务器的Ip地址int localport = request.getLocalPort() ;  //服务器的端口号String remoteIp = request.getRemoteAddr() ; //客户端的IPint remotePort = request.getRemotePort() ;  //客户端的端口号: 随机的String query = request.getQueryString() ;String method = request.getMethod() ;out.write("url:" + url + "<br>") ;out.write("uri:" + uri + "<br>") ;out.write("工程名称:" + contextpath + "<br>") ;out.write("请求的编码:" + encoding + "<br>") ;out.write("服务器的ip地址:" + localIp + "<br>") ;out.write("服务器的端口号:" + localport + "<br>") ;out.write("客户端的ip地址:" + remoteIp+ "<br>") ;out.write("客户端的端口号:" + remotePort + "<br>") ;out.write("请求参数:" + query + "<br>") ;out.write("请求方式:" + method + "<br>") ;}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}

运行结果:

url:http://localhost:8080/day09_01_httpServletRequest/servlet/ServletRequest11
uri:/day09_01_httpServletRequest/servlet/ServletRequest11
工程名称:/day09_01_httpServletRequest
请求的编码null
服务器的ip地址0:0:0:0:0:0:0:1
服务器的端口号8080
客户端的ip地址:0:0:0:0:0:0:0:1
客户端的端口号:52177
请求参数:null
请求方式:GET

2.获取客户机请求头信息

getHeader(String name): 根据头名称获得头值

getHeaderNames():获得所有的头名称

getHeaders(String name): 获得同名的键值

package com.heima.request;import java.io.IOException;import java.util.Enumeration;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//演示获取请求头信息public class ServletRequest2 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//获取单个请求头信息//String s = request.getHeader("Accept-Encoding") ;//System.out.println(s);//获取同名的请求头的多个值//Enumeration<String> enu = request.getHeaders("Accept-Encoding") ;//while(enu.hasMoreElements()){//System.out.println(enu.nextElement());//}//拿到所有的请求头和值Enumeration<String> enu = request.getHeaderNames() ;while(enu.hasMoreElements()){String key = enu.nextElement() ;System.out.println(key + ":" + request.getHeader(key)) ;}}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}

3.获取表单提交的信息

package com.heima.request;import java.beans.IntrospectionException;import java.beans.PropertyDescriptor;import java.io.IOException;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.Enumeration;import java.util.Map;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.beanutils.BeanUtils;import com.heima.bean.User;//演示获取表单提交的信息public class ServletRequest3 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//String encoding = request.getCharacterEncoding() ;//System.out.println(encoding); test1(request);// test2(request);// test3(request);// test4(request);// test5(request);//test6(request);//test7(request);}// 1.获取单个控件的值 eg:获取姓名public void test1(HttpServletRequest request) {String name = request.getParameter("username"); // 参数是控件的名字System.out.println("姓名: " + name);}// 2.获取同名控件的值 eg:获取密码public void test2(HttpServletRequest request) {String[] pass = request.getParameterValues("password");for (String string : pass) {System.out.println(string);}}// 3.获取所有控件的名字和值public void test3(HttpServletRequest request) {// 获取所有控件的名字Enumeration<String> enu = request.getParameterNames();while (enu.hasMoreElements()) {String name = enu.nextElement();// 由于名字可能会重复,一个名字对一个多个值String[] values = request.getParameterValues(name);for (String value : values) {System.out.println(name + ":" + value);}}}// 4.将表单中的所有值封装到Javabean中: 采用PropertyDescriptorpublic void test4(HttpServletRequest request) {// 将页面传递的内容封装到user对象中User user = new User();System.out.println("封装前: " + user);// 获取所有控件的名字Enumeration<String> enu = request.getParameterNames();while (enu.hasMoreElements()) {String name = enu.nextElement();// 由于名字可能会重复String[] values = request.getParameterValues(name);try {// 拿到属性name的属性描述器PropertyDescriptor pd = new PropertyDescriptor(name, User.class);// 将值注入到属性中// 拿到写描述器Method method = pd.getWriteMethod();// 为了兼容jdk1.4,sun开发的invoke方法在执行的时候将参数拆开进行传递,所以导致IllegalArgumentException异常if (values.length == 1)//针对name,只有一个method.invoke(user, values);else {//针对密码 把数组强转成object类型,就相当于一个对像 不会被拆开//出问题的时候的原因是:user.setPassword(111,222);只需要一个参数,但因为是数组被拆开了,传递了两个参数,而不是数组// 解决办法一:// method.invoke(user, (Object)values)// ;// 解决办法二method.invoke(user, new Object[] { values });}} catch (IntrospectionException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();}}System.out.println("封装后: " + user);}// 5.将表单中的所有值封装到Javabean中: 采用第三方的jar进行封装: BeanUtils类public void test5(HttpServletRequest request) {// 将页面传递的内容封装到user对象中User user = new User();System.out.println("封装前: " + user);// 获取所有控件的名字Enumeration<String> enu = request.getParameterNames();while (enu.hasMoreElements()) {String name = enu.nextElement();// 由于名字可能会重复String[] values = request.getParameterValues(name);// 采用BeanUtils类封装  //注意导入的包是apache的try {BeanUtils.setProperty(user, name, values);//注意:不能封装时间类型的数据,要注册一个类型转换器} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();}}System.out.println("封装后: " + user);}// 6.将表单中的所有值封装到Javabean中: 采用第三方的jar进行封装: BeanUtils类public void test6(HttpServletRequest request) {// 将页面传递的内容封装到user对象中User user = new User();System.out.println("封装前: " + user);// 拿到控件的名字和值的键值对Map<String, String[]> map = request.getParameterMap();//不管页面上填写的是什么类型的数据,都是String类型for (Map.Entry<String, String[]> entry : map.entrySet()) {// 拿到控件的名字 String name = entry.getKey();// 拿到控件的值String[] values = entry.getValue();// 封装数据try {BeanUtils.setProperty(user, name, values);} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();}} System.out.println("封装后: " + user);}// 7.终极必杀技public void test7(HttpServletRequest request) {// 将页面传递的内容封装到user对象中User user = new User();System.out.println("封装前: " + user);try {BeanUtils.populate(user, request.getParameterMap()) ;} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("封装后: " + user);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}

bean:
package com.heima.bean;import java.io.Serializable;import java.util.Arrays;public class User implements Serializable{private String username ;private String[] password ;private String gander ;private String[] loves ;private String country ;private String description ;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 getGander() {return gander;}public void setGander(String gander) {this.gander = gander;}public String[] getLoves() {return loves;}public void setLoves(String[] loves) {this.loves = loves;}public String getCountry() {return country;}public void setCountry(String country) {this.country = country;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}@Overridepublic String toString() {return "User [username=" + username + ", password="+ Arrays.toString(password) + ", gander=" + gander + ", loves="+ Arrays.toString(loves) + ", country=" + country+ ", description=" + description + "]";}//@Override//public String toString() {//return "User [username=" + username + ", password="//+ Arrays.toString(password) + "]";//}}

一个javabean的规则:

1.所有的属性:私有的private

2.提供get()和set()方法

3.无参的构造器

此处还要实现序列化:

把该文件可能要写到一个硬盘里也可能要通过网络进行传输。

实现序列化Serializable:该接口没有定义任何方法,只是一个标志性的接口,表示该对象(User)可以被序列化,对象需要通过网络进行传输,一定要求实现序列化,目的是从一台电脑上传输的数据,到达另一台电脑上时,保证两边的数据是完全一致的


login.html
    <body>      <form action="/day09_01_httpServletRequest/servlet/ServletRequest3" method="post">        姓名: <input type = "text" name = "username" ><br>        密码:<input type = "text" name = "password" ><br>       确认 密码:<input type = "text" name = "password" ><br>       <input type = "submit" value = "提交" >       </form>  </body>



4.封装页面各种控件的值

register.html:
<!DOCTYPE html><html>  <head>    <title>login.html</title>    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">    <meta http-equiv="description" content="this is my page">    <meta http-equiv="content-type" content="text/html; charset=UTF-8">        <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->  </head>  <script type="text/javascript">  function fun_submit(){  //数据检测    //提交数据  var form = document.forms[0] ;  form.method = "post" ;  form.submit() ;  }  </script>  <body>      <form action="/day09_01_httpServletRequest/servlet/ServletRequest6" method="post">        姓名: <input type = "text" name = "username" ><br>        密码:<input type = "text" name = "password" ><br>        确认 密码:<input type = "text" name = "password" ><br>       性别: <input type = "radio" name = "gander" value = "男" >男<input type = "radio" name = "gander" value = "女">女<br>       爱好:<input type = "checkbox" name = "loves" value = "打篮球">打篮球       <input type = "checkbox" name = "loves" value = "踢足球">踢足球       <input type = "checkbox" name = "loves" value = "聊天">聊天<br>       国籍: <select name = "country">         <option value = "中国">中国</option>         <option value = "美国">美国</option>         <option value = "日本">日本</option>       </select>       备注: <textarea rows="5" cols="20" name = "description">大神留下脚印吧!!!</textarea><br>      <!--  <input type = "submit" value = "提交" >  -->      <input type = "button" value = "提交" onclick = "fun_submit()">      </form>        </body></html>

User:
package com.heima.bean;import java.io.Serializable;import java.util.Arrays;public class User implements Serializable{private String username ;private String[] password ;private String gander ;private String[] loves ;private String country ;private String description ;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 getGander() {return gander;}public void setGander(String gander) {this.gander = gander;}public String[] getLoves() {return loves;}public void setLoves(String[] loves) {this.loves = loves;}public String getCountry() {return country;}public void setCountry(String country) {this.country = country;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}@Overridepublic String toString() {return "User [username=" + username + ", password="+ Arrays.toString(password) + ", gander=" + gander + ", loves="+ Arrays.toString(loves) + ", country=" + country+ ", description=" + description + "]";}//@Override//public String toString() {//return "User [username=" + username + ", password="//+ Arrays.toString(password) + "]";//}}

Servlet:
package com.heima.request;import java.io.IOException;import java.lang.reflect.InvocationTargetException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.beanutils.BeanUtils;import com.heima.bean.User;//演示封装表单中的数据public class ServletRequest6 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding("UTF-8") ;User user = new User() ;System.out.println("封装前: " + user);//将表单数据封装到user对象中try {BeanUtils.populate(user, request.getParameterMap()) ;} catch (Exception e) {e.printStackTrace();}System.out.println("封装后: " + user);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}

注意:在页面中没有填写表单的数据的时候,拿到的是空字符串
当把控件名写错的时候,即不存在该控件的时候,拿到的是null

封装表单控件的值

    对于text类型的控件,如果没有填写内容,那么封装后的数据是空字符串

    对于radio,checbox类型, 如果没有选择,那么封装后的数据是null


5.中文乱码解决

html:
<body>      <h1>表单中文乱码的解决</h1>      <hr>      <form action="/day09_01_httpServletRequest/servlet/ServletRequest4" method="get">        姓名: <input type = "text" name = "username" ><br>        密码:<input type = "text" name = "password" ><br>       确认 密码:<input type = "text" name = "password" ><br>       <input type = "submit" value = "注册" >       </form>            <a href = "/day09_01_httpServletRequest/servlet/ServletRequest4?username=中国">啊啊啊啊啊</a>  </body>

服务器并没有指定默认用什么编码

而浏览器在发送的时候默认编码是ISO-8859-1

解决:
1. 当提交方式是post方式的时候
request.setCharacterEncoding("UTF-8") ;

2.当提交方式是get方式的时候:
(1)用中文填写的控件比较少时,采用重建字符串

在表单中填写了中文,在传递数据之前,先用了URL-Encoding进行了编码,

在数据传递的过程中,又采用ISO-8859-1进行了编码

new String(name.getBytes("ISO-8859-1"),"utf-8");
(2)用中文填写的控件比较多时,更改服务器编码

修改服务器的配置文件server.xml

到服务器的路径打开全局配置文件tomcat—conf—server.xml

修改后要重启服务器

Connector链接器:就是把请求提交给Servlet引擎进行分析,然后tomcat引擎就来分析这个请求是要提交给哪个servlet来处理;

当连接器把请求转发给tomcat的时候,就指定了它的编码是utf-8


3.使用超链传递的参数

超链传递参数也一样用:?键值对:

跟get方式的解决一样

4.直接在地址栏里访问服务端

http://localhost:8080/day09Request/servlet/ServletRequest4?username=小龙女

服务端拿到的是乱码

直接在地址栏里输入中文,跟get方式比,少了一步URL-Encoding编码,直接是ISO-8859-1进行编码

采用重建字符串:new String(name.getBytes("ISO-8859-1")) ;

注意:此时不要更改服务器编码

package com.heima.request;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//演示中文乱码问题解决public class ServletRequest4 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {/** *   1. 当提交方式是post方式的时候 *       request.setCharacterEncoding("UTF-8") ; *   2.当提交方式是get方式的时候,采用重建字符串 *    */request.setCharacterEncoding("UTF-8") ;String name = request.getParameter("username") ;//如果是get方式提交: 解决办法就是重建字符串//name = new String(name.getBytes("ISO-8859-1"),"utf-8") ;System.out.println(name);//当写中文的控件比较多的时候: 采取更改服务器编码的办法 ,去到服务器中更改,添加属性;URIEncodig = "UTF-8",需要重启服务器}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}

package com.heima.request;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//演示直接从地址栏中输入中文的乱码解决public class ServletRequest5 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String name = request.getParameter("username") ;name = new String(name.getBytes("ISO-8859-1")) ;System.out.println(name);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}




6.请求转发、请求包含和请求重定向

请求转发和请求包含:
本质上没有差别,只是方向不同
请求转发:我过去,我转发到你那边(本身页面的东西也会被执行)
请求包含:你过来,把你包含到我这边
package com.heima.request;import java.io.IOException;import javax.servlet.RequestDispatcher;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//演示request对象作为一个域对象使用public class ServletRequest7 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setAttribute("name", "小龙女") ;System.out.println("你过来了");//请求转发器//RequestDispatcher rd = request.getRequestDispatcher("/servlet/ServletRequest8") ;//绝对路径 /:代表了工程路径RequestDispatcher rd = request.getRequestDispatcher("ServletRequest8") ;//转发到ServletRequest8中//rd.forward(request, response) ;   //请求转发//请求重定向到新的资源response.sendRedirect(request.getContextPath() + "/servlet/ServletRequest8") ;/** * request对象的请求转发和ServletContext对象的请求转发的区别: * request对象的请求的路径支持相对路径, * ServletContext对象的请求转发不支持相对路径 *///rd.include(request, response) ;  //把ServletRequest8包含进来//拿取数据//int age = (Integer) request.getAttribute("age") ;//System.out.println(age);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}


package com.heima.request;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//从请求中拿取数据public class ServletRequest8 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String name = (String) request.getAttribute("name") ;request.setAttribute("age", 100) ;System.out.println(name);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}

请求重定向




8.URL的写法

a) 客户端跳转(由浏览器发出请求)  :路径前加工程名称(request.getContextPath()) ;

1)表单

2)script,link,img  标签

3)超链

b) 服务端跳转(由服务器发出的请求): 路径前不加工程名称

请求转发

请求转发一直是同一个请求,是服务端的操作,由服务器发出来的

请求重定向是不同的请求:是客户端发浏览器出来的。

请求重定向到新的资源后,因为是两个请求,原本页面的数据就拿不到了


9.getParameter()和getAttribute()的区别

getParameter():拿取页面、表单、超链的数据 没有setParameter()

getAttribute():拿取setAttribute()的数据


通过请求转发延长request对象的生命:

Index.jsp:
<body>    <form action = "/day11session/servlet/ServletDemo1" method = "post">    姓名:<input type = "text" name = "username">    <input type = "submit" value = "提交">        </form>  </body>

ServletDemo1.java:
package requestdispatche;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class ServletDemo1 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();request.setAttribute("username", "张无忌");request.getRequestDispatcher("ServletDemo2").forward(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}

ServletDemo2.java:
package requestdispatche;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class ServletDemo2 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();System.out.println("我是demo2,经过了这里");request.getRequestDispatcher("ServletDemo3").forward(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}

ServletDemo3.java:
package requestdispatche;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class ServletDemo3 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();//拿取页面的数据String pageUsername = request.getParameter("username");System.out.println("页面传递的数据:"+pageUsername);//拿取setAttribute的数据String username = (String) request.getAttribute("username");System.out.println("存储在request中的数据:"+username);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}

运行结果:
我是demo2,经过了这里
页面传递的数据:张三丰
存储在request中的数据:张无忌










0 0
原创粉丝点击