JavaWeb请求与响应(一)

来源:互联网 发布:linux下安装redmine 编辑:程序博客网 时间:2024/06/15 21:28

所做的事情
1.请求来到HTTP服务器后,HTTP将请求交给Web容器(tomcat)
2.容器会创建2个对象 ,HttpServletRequest对象和HttpServletResponse对象

HttpServletRequest对象:容器将请求相关信息设置给此对象
HttpServletResponse对象:对客户端做出响应的对象

3.容器读取@WebServlet或者web.xml的设置,找出处理该请求的Servlet,并调用service()方法,将上面2个对象作为参数传入service()方法中
4.service()方法会根据HTTP请求的方式,来执行对应的doxxx()方法 (例如doGet() doPost()方法)
5.例如调用doGet()方法,可以使用HttpServletRequest对象和HttpServletResponse对象。使用getParameter()取得请求参数,使用getWriter()取得输出用的PrintWriter对象,并进行各种响应处理。
6.最后由容器转化为HTTP响应,再有HTTP服务器对浏览器进行响应。然后,容器将HttpServletRequest对象和HttpServletResponse对象销毁回收,该次请求响应结束。

关于HttpServletRequest

处理请求参数与标头

//请求参数*getParameter():指定 请求参数名称来取得对应的值例如:String username = request.getParameter("name");返回值是String类型,如果要得到基本数据类型,可以使用Integer.parseInt()。如果没有指定请求参数名称,则返回null*getParameterValues():如果窗体上有可复选的元件,如复选框(Checkbox)、列表(List)等,则同一个请求参数名称可能会有多个值,那么此方法可返回一个String数组。String[] values = request.getParameterValues("param");*getParameterNames():查看请求中有多少请求参数,返回值是Enumeration对象,包括所有的请求参数名称。取所有请求参数名称:Enumeration<String> e = req.getParameterNames();while(e.hasMoreElements){    String param = e.nextElement();    ...}*getParameterMap():将请求参数以Map对象返回,键(key)是请求参数名称,值(value),以字符串数组类型String[]返回。//标头(Header)信息*getHeader():指定标头名称后可返回字符串值,代表浏览器所送出的标头信息。*getHeaders():指定标头名称后可返回Enumeration,元素为字符串。*getHeaderNames():取得所有标头名称,以Enumeration返回,含有所有标头名称,以Enumeration返回,内含所有标头字符串名称。

请求参数编码处理
1.POST请求参数编码处理
网页编码是UTF-8,通过窗体使用POST发出“林”,会将“林”作URL编码为%E6%9E%97再发送出去,相当于浏览器执行此操作:

String text = java.net.URLEncoder.encode("林","UTF-8");

在Servlet中取得请求参数时,容器若默认使用ISO-8859-1来处理编码,相当于执行此操作

String text = java.net.URLDecoder.decode("%E6%9E%97","ISO-8859-1");

这样解出来的中文字符是不正确的。
若浏览器以UTF-8发送请求,接收时也要用UTF-8编码字符串,执行此语句

req.setCharacterEncoding("UTF-8");//此方法只对请求Body字符编码才有用,也就是基本上对POST有用

2.Get请求参数编码处理
如果GET仍使用setCharacterEncoding()那么对请求参数不会起作用,仍然是乱码。
浏览器使用UTF8处理字符,Web容器默认是ISO-8859-1,正确处理编码方式为:

String name = req.getParameter("name");String name = new String("ISO-8859-1","UTF-8")'

如果不做任何处理:

//浏览器 将汉字用UTF-8编码String text = java.net.URLEncoder.encode("林","UTF-8");//web容器将text用ISO-8859-1进行解码text = java.net.URLDecoder.decode("%E6%9E97""ISO-8859-1");

3.读取Body内容
getReader():
返回类型 BufferedReader对象

BufferedReader reader = request.getReader();

处理文件
getInputStream():
返回类型 ServletInputStream对象(代表请求Body的串流对象)
可以利用它来处理上传的文件区段.
getPart(),getParts()取得上传文件

4.RequsetDispatcher调派请求
1.include()方法

RequestDispatcher dispatcher = request.getRequestDispatcher("other.view");dispatcher.include(req.resp);

会调到other.view对应的Servlet1去执行,但不能在Servlet1上进行响应设置,执行完后会回到调用它的Servlet0上继续执行相关任务.

无论是include还是forward方法可以设置属性来共享”对象”
setAttribute():指定名称与对象设置属性.
getAttribute():指定名称取得属性.
getAtttributeNames():取得所有属性名称.
removeAttribute:指定名称移除属性.

//servlet1String book = "lion";request.setAttribute("book",book);request.getRequestDispather("servlet2").include(request,response);//servlet2String book = request.getAttribute("book");

forward()方法
当servlet0执行到forward(“other.view”)方法时,会找到other.view对应的servlet2,然后继续执行servlet2。

String.format()方法
可以将字符串设置成指定格式

String message = String.format(htmlTemplate,user,message);//user和message都是属性参数//htmlTemplate 字符串内容
1 0
原创粉丝点击