web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象和代表响应的response对象。request和response对象既然代表请求和响应,那我们获取客户机提交过来的数据,只需要找request对象即可,要向客户机输出数据,只需要找response对象即可。这一节我们来看看Servlet的这两个对象:HttpServletResponse对象和HttpServletRequest对象。
1. HttpServletRequest对象
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象中的方法,可以获得客户的这些信息。
1)获取客户机环境信息常用的方法如下:(具体见Demo1)
- getRequestURL();
- getRequestURI();
- getQueryString();
- getRemoteAddr();
- getRemoteHost();
- getRemotePort();
- getLocalAddr();
- getLocalName();
- getMethod();
相应的示例代码Demo1如下:
-
- public class RequestDemo1 extends HttpServlet {
-
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
-
-
- System.out.println(request.getRequestURL());
- System.out.println(request.getRequestURI());
-
-
- System.out.println(request.getQueryString());
-
- System.out.println(request.getRemoteAddr());
- System.out.println(request.getRemoteHost());
- System.out.println(request.getRemotePort());
- System.out.println(request.getLocalAddr());
-
- System.out.println(request.getMethod());
- }
-
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
-
- doGet(request, response);
- }
- }
2)获取请求信息常用的方法--Map如下:(Demo2)
-
- getHeader(String name);
- getHeaders(String name);
- getHeaderNames();
-
-
- getParameter(name);
- getParameterValues(String name);
- getParameterNames();
- getParameterMap();
相应的示例代码Demo2如下:
- public class RequestDemo2 extends HttpServlet {
-
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- <pre name="code" class="java">
- System.out.println(request.getHeader("Accept-Encoding"));
-
-
- Enumeration e = request.getHeaders("Accept-Encoding");
- while(e.hasMoreElements()) {
- String value = (String) e.nextElement();
- System.out.println(value);
- }
- System.out.println("----------------------------");
-
- e = request.getHeaderNames();
- while(e.hasMoreElements()) {
- String name = (String) e.nextElement();
- String value = request.getHeader(name);
- System.out.println(name + "=" + value);
- }
- System.out.println("----------------------------");
-
- System.out.println(request.getParameter("name"));
-
-
- String likes[] = request.getParameterValues("like");
-
- for(int i = 0; likes != null && i < likes.length; i++) {
- System.out.println(likes[i]);
- }
- System.out.println("----------------------------");
-
- e = request.getParameterNames();
- while(e.hasMoreElements()) {
- String name = (String) e.nextElement();
- String value = request.getParameter(name);
- System.out.println(name + "=" + value);
- }
- System.out.println("----------------------------");
-
- Map<String, String[]> map = request.getParameterMap();
- for(Map.Entry<String, String[]> me : map.entrySet()) {
- String name = me.getKey();
- String value[] = me.getValue();
- System.out.println(name + "=" + value[0]);
- }
- }
-
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doGet(request, response);
- }
- }
3)实现请求转发:(Demo3/test.jsp/Demo4)
request对象实现请求转发:请求转发指一个web资源受到客户端请求后,通知服务器去调用另一个web资源进行处理。请求转发应用场景:MVC设计模式 request对象提供了一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象的forwoard方法可以实现请求转发。 request对象同时也是一个域对象,开发人员通过request对象在实现转发时,把数据通过request对象带给其他web资源处理。相关方法如下:
- setAttribute();
- getAttribute();
- removeAttribute();
- getAttributeNames();
-
相应的示例代码如下:
-
- public class RequestDemo3 extends HttpServlet {
-
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
-
- String data = "abcd";
-
-
-
-
-
- request.setAttribute("data", data);
-
-
-
-
-
-
- RequestDispatcher rd = request.getRequestDispatcher("/test.jsp");
- rd.forward(request, response);
- }
-
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
-
- doGet(request, response);
- }
- }
相应的test.jsp页面如下:
- <html>
- <head>
- </head>
- <body>
- <%
- //String data = (String) this.getServletContext().getAttribute("data");
- String data = (String) request.getAttribute("data");
- out.write(data);
- %>
- </body>
- </html>
4)获取用户提交数据(Demo4/form.html)
首先看一下前台页面form.html,主要是获得几个参数:
- <!DOCTYPE html>
- <html>
- <head>
- <title>form.html</title>
-
- <meta name="keywords" content="keyword1,keyword2,keyword3">
- <meta name="description" content="this is my page">
- <meta name="content-type" content="text/html; charset=UTF-8">
- <meta http-equiv="content-type" content="text/html;charset=UTF-8">
-
-
- </head>
-
- <body>
- <form action="/test/servlet/RequestDemo4" method="get">
- 用户名:<input type="text" name="username"/><br/>
- 密码:<input type="password" name="password"/><br/>
- 性别:
- <input type="radio" name="gender" value="male"/>男
- <input type="radio" name="gender" value="female"/>女<br/>
-
- 城市:
- <select name="city">
- <option value="beijing">北京</option>
- <option value="shanghai">上海</option>
- <option value="guangzhou">广州</option>
- </select><br/>
-
- 爱好:
- <input type="checkbox" name="like" value="sing">唱歌
- <input type="checkbox" name="like" value="dance">跳舞
- <input type="checkbox" name="like" value="basketball">篮球
- <input type="checkbox" name="like" value="football">足球
- <br/>
-
- 简历:
- <textarea rows="5" cols="60" name="resume">请输入简历</textarea>
- <br/>
-
- 相片:
- <input type="file" name="file"/><br/>
-
- <input type="hidden" name="name" value="xxx"><br/>
-
- <input type="submit" value="提交"/>
-
- </form>
- </body>
- </html>
当用户提交后,自动跳转到RequestDemo4这个Servlet来处理:
- public class RequestDemo4 extends HttpServlet {
-
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
-
- request.setCharacterEncoding("UTF-8");
-
-
-
- System.out.println(request.getParameter("username"));
- System.out.println(request.getParameter("gender"));
- System.out.println(request.getParameter("city"));
-
- String likes[] = request.getParameterValues("like");
- for(int i = 0; likes != null && i < likes.length; i++){
- System.out.println(likes[i]);
- }
-
- System.out.println(request.getParameter("resume"));
- System.out.println(request.getParameter("name"));
- }
-
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
-
- doGet(request, response);
- }
-
- }
request比较简单,在开发中主要是用来获取前台带来的数据,以及实现跳转等等。下面看看response对象。
2. HttpServletResponse对象
这个对象是指服务器的响应,这个对象中封装了想客户端发送数据,发送响应头,发送响应状态码的方法。如:
- PrintWriter getWriter(); /得到字符流
- ServletOutputStream getOutputStream();
- void setStatus(int sc);
- void setHead(String name, String value);
response常见应用有如下几个:
1)向客户端输出中文数据:分别以OutputStream和PrintWriter输出(Demo1)
- public class ResponseDemo1 extends HttpServlet {
-
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
-
-
- outputChineseByChar(response);
- }
-
- private void outputChineseByChar(HttpServletResponse response)
- throws IOException {
- String data = "中国";
-
- response.setHeader("content-type", "text/html;charset=UTF-8");
- response.setCharacterEncoding("UTF-8");
-
-
-
-
-
- PrintWriter out = response.getWriter();
- out.write(data);
- }
-
-
- private void outputChineseByByte(HttpServletResponse response)
- throws IOException, UnsupportedEncodingException {
-
- String data = "中国";
- OutputStream out = response.getOutputStream();
-
- response.setHeader("content-type", "text/html;charset=UTF-8");
-
-
-
- out.write(data.getBytes("UTF-8"));
- }
-
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
-
- doGet(request, response);
- }
-
- }
2)文件下载和中文文件下载(Demo2)
- public class ResponseDemo2 extends HttpServlet {
-
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
-
-
-
- downloadErrorDemo(response);
- }
-
-
- private void downloadFile(HttpServletResponse response) throws FileNotFoundException, IOException {
- String realPath = this.getServletContext().getRealPath("/狗狗.jpg");
- String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
-
-
- response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(fileName));
-
- FileInputStream in = new FileInputStream(realPath);
- int len = 0;
- byte buffer[] = new byte[1024];
- OutputStream out = response.getOutputStream();
- while((len = in.read(buffer)) > 0) {
- out.write(buffer, 0, len);
- }
-
- in.close();
- }
-
-
- private void downloadErrorDemo(HttpServletResponse response) throws FileNotFoundException, IOException {
- String realPath = this.getServletContext().getRealPath("/狗狗.jpg");
- String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
-
- response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(fileName));
-
- FileReader in = new FileReader(realPath);
- int len = 0;
- char buffer[] = new char[1024];
- PrintWriter out = response.getWriter();
- while((len = in.read(buffer)) > 0){
- out.write(buffer, 0, len);
- }
-
-
-
-
-
-
-
- in.close();
- }
-
-
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
-
- doGet(request, response);
- }
-
- }
3)输出随机图片(Demo3)
- public class ResponseDemo3 extends HttpServlet {
-
- public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-
-
- response.setHeader("cache-control", "no-cache");
-
-
- response.setHeader("content-type","image/jpeg");
-
-
- BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);
-
-
- Graphics2D g = (Graphics2D)image.getGraphics();
- g.setColor(Color.WHITE);
- g.fillRect(0, 0, 80, 20);
-
-
- g.setColor(Color.RED);
- g.setFont(new Font(null,Font.BOLD,20));
- g.drawString(makeNum(), 0, 20);
-
-
- ImageIO.write(image, "jpg", response.getOutputStream());
- }
-
- private String makeNum() {
- Random r = new Random();
- String num = r.nextInt(9999999) + "";
- StringBuffer sb = new StringBuffer();
- for(int i = 0; i < 7-num.length(); i++){
- sb.append("0");
- }
- return sb.toString() + num;
- }
-
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
-
- doGet(request, response);
- }
-
- }
4)发送http头以及请求重定向(这一块放在下一篇博客里解说)
3. web工程中url地址的写法
在程序中有写:
-
- public class ResponseDemo4 extends HttpServlet {
-
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
-
-
-
-
- this.getServletContext().getRealPath("/dog.jpg");
-
-
- this.getServletContext().getRequestDispatcher("/servlet/ResponseDemo3");
-
-
- response.sendRedirect("/test/servlet/ResponseDemo3");
-
-
- }
-
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
-
- doGet(request, response);
- }
-
- }
HttpServletRequest和HttpServletResponse就介绍这么多,如有错误之处,欢迎留言指正~ 相关阅读:http://blog.csdn.net/column/details/servletandjsp.html
_____________________________________________________________________________________________________________________________________________________
-----乐于分享,共同进步!
-----更多文章请看:http://blog.csdn.net/eson_15