标签:详细 一个输入流 方法 组合 while 举例 div style 虚拟
// getMethod(); 获得请求方式 // ***getRequestURL();返回客户端发出请求时的完整URL。 // ***getRequestURI(); 返回请求行中的资源名部分。 // *****getContextPath(); 当前应用的虚拟目录 /day09_01_HttpServletRequest // getQueryString() ; 返回请求行中的参数部分。 System.out.println(request.getMethod());// GET System.out.println(request.getRequestURL()); // http://localhost:8080/day09_01_HttpServletRequest/servlet/demo1 System.out.println(request.getRequestURI()); // /day09_01_HttpServletRequest/servlet/demo1 System.out.println(request.getContextPath()); // /day09_01_HttpServletRequest System.out.println(request.getQueryString()); // username=tom
举例二:Get http://localhost:6060/Web_Servlet/ServletTest3?username=faker&password=mid http/1.1
相关方法:
getRequestURI();
getRequestURL();
getProtocol();
getScheme();
getServerName();
getServerPort();
getContextPath();
getServletPath();
getQueryString();
getRemoteAddr();
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.统一资源标记符 /Web_Servlet/ServletTest3 String uri = req.getRequestURI(); System.out.println(uri); //2.统一资源定位符 http://localhost:6060/Web_Servlet/ServletTest3 StringBuffer url = req.getRequestURL(); System.out.println(url); //3.协议和版本 HTTP/1.1 String potocol = req.getProtocol(); System.out.println(potocol); //4.协议 http String scheme = req.getScheme(); System.out.println(scheme); //5.主机(域名) localhost,如果你使用的是ip地址,就显示ip地址 String serverName = req.getServerName(); System.out.println(serverName); //6.端口 6060(这是我自己修改了的端口,默认是8080) int port = req. getServerPort(); System.out.println(port); //7.发布到tomcat下的项目名称 /Web_Servlet String contextPath = req.getContextPath(); System.out.println(contextPath); //8.servlet路径 /ServletTest3 String servletPath = req.getServletPath(); System.out.println(servletPath); //9.获取所有请求参数,即?之后所有东西。 username=faker&password=mid String queryString = req.getQueryString(); System.out.println(queryString); //10.远程主机的ip地址 0:0:0:0:0:0:0:1 String remoteAddr = req.getRemoteAddr(); System.out.println(remoteAddr); }
我们可以查看任意一个网页,它都是有请求头的。
相关方法:
String getHeader(String name) 根据头名称得到头信息值
long getDateHeader(java.lang.String name) 获得指定头内容Date
int getIntHeader(java.lang.String name) 获得指定头内容int
Enumeration getHeaderNames() 得到所有头信息name
Enumeration getHeaders(String name) 根据头名称得到相同名称头信息值
举例1:Enumeration getHeaderNames() 得到所有头信息name
Enumeration<String> headerNames = req.getHeaderNames(); while(headerNames.hasMoreElements()){ String key = (String)headerNames.nextElement(); String value = req.getHeader(key); System.out.println(key+"="+value); }
结果:
举例2:Enumeration getHeaders(String name) 根据头名称得到相同名称头信息值
Enumeration<String> headers = req.getHeaders("accept-language"); while(headers.hasMoreElements()){ String key = (String)headers.nextElement(); String value = req.getHeader(key); System.out.println(key+"==="+value); }
结果:
1)与表单获取相关的方法
方法:
String getParameter(name) 根据表单中name属性的名,获取value属性的值方法
String[] getParameterValues(String name) 专为复选框取取提供的方法
getParameterNames() 得到表单提交的所有name的方法
Map<String , String[]> getParameterMap() 得到表单提交的所有值的方法 //做框架用,非常实用
getInputStream 以字节流的方式得到所有表单数据
举例:
<form action="/day09_01_HttpServletRequest/servlet/demo3" method="get"> 用户名:<input type="text" name="userName"/><br/> 密码:<input type="password" name="pwd"/><br/> 性别:<input type="radio" name="sex" value="男" checked="checked"/>男 <input type="radio" name="sex" value="女"/>女 <br/> 爱好 : <input type="checkbox" name="hobby" value="篮球"/>篮球 <input type="checkbox" name="hobby" value="唱歌"/>唱歌 <input type="checkbox" name="hobby" value="编码"/>编码 <br/> 所在城市: <select name="city"> <option>------请选择------</option> <option value="bj">北京</option> <option value="sh">上海</option> <option value="gz">广州</option> </select> <br/> <input type="submit" value="注册"/> </form>
测试1使用方法:
//获取表单数据 //根据表单中name属性的名,获取value属性的值方法 String userName = request.getParameter("userName"); String pwd = request.getParameter("pwd"); String sex = request.getParameter("sex"); String[] hobbys = request.getParameterValues("hobby"); String city = request.getParameter("city"); userName = new String(userName.getBytes("iso-8859-1"),"UTF-8"); System.out.println(userName); System.out.println(pwd); System.out.println(sex); for (int i = 0;hobbys!=null && i < hobbys.length; i++) { System.out.print(hobbys[i]+"\t"); } System.out.println(); System.out.println(city);
测试2使用方法:
getParameterNames() 得到表单提交的所有name的方法
getParameterValues(String name)专业为复选框取取提供的方法
//获取所有的表单name的名子 Enumeration names = request.getParameterNames(); while(names.hasMoreElements()){ String name = (String) names.nextElement();//得到每一个name名 String[] values = request.getParameterValues(name);//根据name名,得到value值 for (int i = 0;values!=null && i < values.length; i++) { System.out.println(name+"\t"+values[i]);
测试3使用方法:
getParameterMap 到表单提交的所有值的方法 //做框架用,非常实用
try { User u = new User(); System.out.println("封装数据前:"+u); //获取表单数据 Map<String,String[]> map = request.getParameterMap(); for (Map.Entry<String, String[]> m : map.entrySet()) { String name = m.getKey(); String[] value = m.getValue(); //创建一属性描述器 PropertyDescriptor pd = new PropertyDescriptor(name, User.class); //得到setter属性 Method setter = pd.getWriteMethod(); if(value.length==1){ setter.invoke(u, value[0]);//给一个值的变量赋值 }else{ setter.invoke(u, (Object)value);//相关于给复选框赋值 } } System.out.println("封装数据后:"+u); } catch (Exception e) { e.printStackTrace(); }
测试4使用方法:
getInputStream 以字节流的方式得到所有表单数据
request.setCharacterEncoding("UTF-8"); //获取表单数据 ServletInputStream sis = request.getInputStream(); int len = 0; byte[] b = new byte[1024]; while((len=sis.read(b))!=-1){ //System.out.println(new String(new String(b,0,len).getBytes(),"utf-8")); System.out.println(new String(b, 0, len, "UTF-8")); } sis.close();
2)与操作非表单数据相关的方法(request也是一个域对象)
方法:
void setAttribute(String name, Object value);
Object getAttribute(String name);
Void removeAttribute(String name);
3)与请求转发相关的方法
方法:
//得到请求转发或请求包含的协助对象
RequestDispatcher getRequestDispatcher(String path)
forward(ServletRequest request, ServletResponse response) //转发的方法
include(ServletRequest request, ServletResponse response) //请求包含
注意:
include()方法的处理流程:
一是:如果目标组件为Servlet或JSP,就执行它们,并把它们产生的响应正文添加到源组件的响应结果中;
如果目标组件为HTML文档,就直接把文档的内容添加到源组件的响应结果中。
二是:返回到源组件的服务方法中,继续执行后续代码块。
特点:
一是:源组件与被包含的目标组件的输出数据都会被添加到响应结果中。
二是:在目标组件中对响应状态代码或者响应头所做的修改都会被忽略。
使用:
//path:转发后跳转的页面,这里不管用不用"/"开头,都是以web项目根开始,因为这是请求转发,请求转发只局限与在同一个web项目下使用,所以这里一直都是从web项目根下开始的。
request.getRequestDispatcher(String path).forward(request,response);
web项目根:
开发:G:\Workspaces\test01\WebRoot\..
运行时:D:\java\tomcat\apache-tomcat-7.0.53\webapps\test01\..
web站点根:
运行时:D:\java\tomcat\apache-tomcat-7.0.53\webapps\..
从这里可以看出,web项目根就是从该web项目名开始,所以我们请求转发时,只需要接着项目名后面需要访问的路径写就行了。
特点:浏览器中url不会改变,也就是浏览器不知道服务器做了什么,是服务器帮我们跳转页面的,并且在转发后的页面,能够继续使用原先的request,因为是原先的request,所以request域中的属性都可以继续获取到。
4)与编码相关的方法
请求转发指一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理。
request对象提供了一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发。
request对象同时也是一个域对象,开发人员通过request对象在实现转发时,把数据通过request对象带给其它web资源处理。
getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter对象。
getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。 会抛异常。
Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,
然后再与响应状态行和各响应头组合后输出到客户端。
Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,
如果没有,Servlet引擎将调用close方法关闭该输出流对象。
响应状态行 HTTP/1.1 200 OK
常见的响应状态码:
Accept:指示HTTP响应可以接收的文档类型集 Accept-Charset:告知客户可以接收的字符集 Accept-Encoding:所有响应的字符编码集 Content-Type:响应体的MIME类型 Content-Language:响应体的语言类型 Content-Length:响应体的长度和字节数 Expires:通知客户端过期时间,防止客户浏览器使用本地缓存副本 Cookie:包含保存到客户端的Cookie集 Redirect:提供指定重定向,可以不向浏览器输出响应内容,而是直接重新请求到另一个URL地址,实现重定向响应,即是一种自动定向。
//告知浏览器使用什么码表 response.setHeader("content-type", "text/html;charset=UTF-8"); 代替了: //告诉服务器应用使用UTF-8解析文本 response.setCharacterEncoding("UTF-8"); //告诉客户端要使用什么编码 response.setHeader("content-type", "text/html;charset=UTF-8");
常用方法:
getWrite(); 字符输出流
getOutputStream(); 字节输出流
setCharacterEncoding(String charset) 告知服务器使用什么编码
setContentType(String type)
1)重定向运行原理
重定向机制的运作流程
第一步:用户在浏览器端输入特定URL,请求访问服务器端的某个组件
第二步:服务器端的组件返回一个状态码为302的响应结果。
第三步:当浏览器端接收到这种响应结果后,再立即自动请求访问另一个web组件
第四步:浏览器端接收到来自另一个web组件的响应结果。
HttpServeltResponse的sendRedirect(String location)用于重定向
2)具体实现
方式一:手动方案
response.setStatus(302); //状态码302就代表重定向
response.setHeader("location","http://www.baidu.com");
方式二:使用封装好的,通过response.sendRedirect("http://www.baidu.com");
特点:服务器告诉浏览器要跳转的页面,是浏览器主动去跳转的页面,浏览器知道,也浏览器的地址栏中url会变,是浏览器重新发起一个请求到另外一个页面,所以request是重新发起的,跟请求转发不一样。
注意:response.sendRedirect(path); //
第一种:response.sendRedirect("/test01/MyServlet01"); //使用了"/"开头,说明是从web站点根开始,所以需要写test01/MyServlet01
第二种:response.sendRedirect("MyServlet01"); //没有使用"/"开头,说明是从web项目根开始,那么就无需写test01了。
注意:重定向没有任何局限,可以重定向web项目内的任何路径,也可以访问别的web项目中的路径,并且这里就用"/"区分开来,如果使用了"/"开头,就说明我要重新开始定位了,不访问刚才的web项目,自己写项目名,
如果没有使用"/"开始,那么就知道是访问刚才那个web项目下的servlet,就可以省略项目名了。就是这样来区别。
//通过路径得到一个输入流 String path = this.getServletContext().getRealPath("/WEB-INF/classes/美女.jpg"); FileInputStream fis = new FileInputStream(path); //创建字节输出流 ServletOutputStream sos = response.getOutputStream(); //得到要下载的文件名 String filename = path.substring(path.lastIndexOf("\\")+1); //设置文件名的编码 filename = URLEncoder.encode(filename, "UTF-8");//将不安全的文件名改为UTF-8格式 //告知客户端要下载文件 response.setHeader("content-disposition", "attachment;filename="+filename); response.setHeader("content-type", "image/jpeg"); //执行输出操作 int len = 1; byte[] b = new byte[1024]; while((len=fis.read(b))!=-1){ sos.write(b,0,len); } sos.close(); fis.close();
喜欢就点个“推荐”哦!
JavaWeb(一)Servlet中的request与response
标签:详细 一个输入流 方法 组合 while 举例 div style 虚拟
原文地址:http://www.cnblogs.com/zhangyinhua/p/7629221.html