//经常使用方法 //获得的是:协议+服务器地址+端口号+工程名称+资源地址+参数 String url = request.getRequestURL(); //获得的是:工程名称+资源地址 String uri = request.getRequestURI(); //获得的是:工程名称 String contextpath = request.getContextPath(); //获得的是:服务器的IP地址 String encoding = request.getCharacterEncoding(); //获得的是:服务器的端口号 int localport = request.getLocalPort(); //获得的是:客户端的ip String remoteIp = request.getRemoteAddr(); //获得的是:客户端的端口号(随机的) String remotePort = request.getRemotePort(); //请求参数 String query = request.getQueryString(); //请求方式 String method = request.getMethod();
//获取单个请求头信息 String s = request.getHeader("Accept-Encoding"); //获取同名的请求头的多个值 Enumeration<String> enu = request.getHeaders("Accept-Encoding"); while(enu.hasMoreElements()){ System.out.println(enu.nextElement()); } //拿到全部的请求头和值 Enumeration<String> enu = request.getHeaderName(); while(enu.hasMoreElements()){ String key = enu.nextElement(); System.out.println(key + ":" + request.getHeader(key)); }
HTML页面:javascript
<form action="ServletRequest/servlet/TestRequest" 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>
servlet: html
//1.获取单个控件的值 public void test1(HttpServletRequest request){ //当表单里没有填写内容时,获取到的是空字符串 //当所填名字没有对应控件时,获取到的是null String name = request.getParameter("username");//参数是控件的名字 System.out.println("姓名:" + name); }
//2.获取同名控件的值 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 + ":" + request); } } }
//4.将表单中的全部值封装到javabean中: // 采用PropertyDescriptor
javaBeanjava
//实现序列化接口:表示其能够被序列化,让对象通过网络传输不会出错 public class User implements Serializable{ private String username; private String[] password; set,get... ... toString... }
servlet:web
public void test4(HttpServletRequest request){ //将页面传递的内容封装到user对象中 User user = new User(); //获取全部控件的名字 Enumeration<String> enu = request.getParameterNames(); While(enu.hasMoreElements()){ String name = enu.nextElement(); //因为名字可能会重复 String[] values = request.getParameterValues(name); //拿到属性name的属性描述器 PropertyDescriptor pd = new PropertyDescriptor(name, User.class); //将值注入到属性中 //拿到写描述器 Method method = pd.getWriterMethod(); //为了兼容jdk1.4,sun开发的invoke方法在执行的时候将参数拆开进行传递,因此致使异常 if(values.length == 1) method.invoke(user,values); else{ //解决办法一:(底层的values已经不是一个数组了) method.invoke(user, (Object}values); //解决办法二: method.invoke(user, new Object[]{values}); } } System.out.println("封装后:" + user); }
//5.将表单中的全部值封装到javabean中:(其它代码同4,只改while中代码) // 采用第三方的jar进行封装:BeanUtils类(Spring框架里提供) While(enu.hasMoreElements()){ String name = enu.nextElement(); //因为名字可能会重复 String[] values = request.getParameterValues(name); //采用BeauUtils类封装 BeanUtils.setProperty(user,name,values); }
//6.将表单中的全部值封装到javabean中: // 采用第三方的jar进行封装:BeanUtils类(Spring框架里提供) public void test6(HttpServletRequest request){ //将页面传递的内容封装到user对象中 User user = new User(); //拿到控件的名字和值的键值对 Map<String,String[]> map = request.getParameterMap(); for(Map.Entry<String, String[]> entry:map.entrySet()){ //拿到控件的名字 String name = entry.getKey(); //拿到控件的值 String values = entry.getValue(); //采用BeauUtils类封装 BeanUtils.setProperty(user,name,values); } }
//7.将表单中的全部值封装到javabean中: // (推荐使用) public void test7(HttpServletRequest request){ //将页面传递的内容封装到user对象中 User user = new User(); BeanUtils.populate(user, request.getParameterMap()); System.out.println("封装后" + user); }
//1.当提交方式为post时: // request.setCharacterEnconding("UTF-8"); request.setCharacterEnconding("UTF-8"); String name = request.getParameter("username");
get方式为何会乱码:填写好传递数据以前,浏览器先用URLEncoder进行编码
在传输过程当中,又用了ISO8859-1进行了一次编码数组
//2.当提交方式为get时: // 重建字符串(适用于内容较少时) request.setCharacterEnconding("UTF-8"); String name = request.getParameter("username"); name = new String(name.getBytes("ISO-8859-1"),"utf-8");
//当写中文较多的时候,采用更改服务器编码方法 //在server.xml中<Connector />中加一个 //URIENcoding = "UTF-8"
//当直接从地址栏中输入中文乱码时 String name = request.getParameter("username"); name = new String(name.getBytes("ISO-8859-1"));
域对象:底层必定有一个Map来存放键值对 浏览器
ServletRequest1中服务器
request.setAttribute("name", "高圆圆"); //请求转发器 RequestDispatcher rd = request.getRequestDispatcher("/servlet/ServletRequest2"); //转发到ServletRequest2中 rd.forward(request, response); //请求转发 rd.include(request, response); //把ServletRequest2包含进来 //拿取ServletRequest2中存取的数据 int age = (Integer)request.getAttribute("age");
ServletRequest2中网络
String name = request.getAttribute("name"); request.setAttribute("age",100);
request对象的请求路劲支持相对路径
ServletContext对象的请求转发不支持相对路径
由于ServletContext是一个全局对象,它表明的是一个工程框架
HTML页面svg
<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><br> 备注: <textarea rows="5" cols="20" name = "description">大神留下脚印吧!!!</textarea><br> <!-- <input type = "submit" value = "提交" > --> <input type = "button" value = "提交" onclick = "fun_submit()"> </form> <script type="text/javascript"> function fun_submit(){ //数据检测 //提交数据 var form = document.forms[0]; form.method = "post"; form.submit(); } </script>
javaBean
public class User implements Serializable{ private String username; private String[] password; private String gander; private String[] loves; private String country; private String description; set,get... tostring... }
servlet中
User user = new User(); //将表单数据封装到user对象中 BeanUtils.populate(user, request.getParameterMap()); System.out.println("封装后:" + user);
//请求重定向到新的资源 //这个执行以后,request就不在这个servlet中了,死亡了,被从新定向到Servlet2了 。 //可是请求转发后request还存在 response.sendRedirect(request.getContextPath() + "/servlet/Servlet2");
客户端跳转:由客户端浏览器发出来的跳转(加工程名称)
服务端跳转:由服务端发出的跳转(不加工程名称)