【WEB】Servlet处理HTTP请求和响应 我就是我 2021-11-02 11:58 333阅读 0赞 既然一次WEB请求分请求和响应两总部分那么Servlet必然也可以处理Web请求的数据,向客户端发送Web响应 ### 1.1.Servet处理Web请求 ### 怎么是把web请求中的数据取出来?全依赖HttpServletRequest对象,HTTP请求的数据都被封装成了Request对象 #### 1.1.1.HttpServletRequest获取请求头中的数据 #### 请求头中的字符串 ![在这里插入图片描述][20190813195950455.png] //获取Get请求重写Servlet中的doGet()方法 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { try { //取出请求方法 String method = req.getMethod(); //取出请求路径 String url = req.getRequestURL().toString(); //取出协议及版本 String protocol = req.getProtocol(); //取出请求头中的内容 String host_head = req.getHeader("host"); String accept_head = req.getHeader("accept"); String userAgent_head = req.getHeader("user-agent"); System.out.println(method + " " + url + " " + protocol); System.out.println("host:" + host_head); System.out.println("user-agent:" + userAgent_head); System.out.println("accept:" + accept_head); //取查询字符串中的数据 String name = req.getParameter("name"); String sex = req.getParameter("sex"); System.out.println("name:" + name + ",sex:" + sex); resp.getWriter().println("Hello World !"); } catch (Exception e) { System.out.println(e); } } ![在这里插入图片描述][20190813200436278.png] #### 1.1.2.Servlet处理不同类型的请求会由servcie()方法派发给不同的方法 #### GET请求 ----> doGet()方法 POST请求 ----> doPost()方法 PUT请求 ---->doPut()方法 DELETE请求---->doDelete()方法 … #### 1.1.3.HttpServletRequest对象获取查询字符串中的数据 #### 其实我们向服务器传递自己的数据进行交互,并非经常利用HTTP请求头,更多的是利用查询字符串参数和表单,查询字符串是写在URL路径中"?"号后的被“&”符号分开的一组键值对如: //下面URL中的查询字符串name=zhangsan&sex=M http://localhost:8080/aaa?name=zhangsan&sex=M 获取查询字符串的代码 //取查询字符串中的数据 String name = req.getParameter("name"); String sex = req.getParameter("sex"); //取查询字符串中的集合数据 获取查询字符串集合数据,如下面的URL中有多个name查询字符串属性,保存了多个不同的值 http://localhost:8080/aaa?name=zhangsan&sex=M&name=lisi&name=wangmazi 获取name属性得到的就必定是一个集合,此时如果getParameter(“name”)返回的只有一个值,所以得用其它方法 //取查询字符串中的集合数据 String[] names=req.getParameterValues("name");System.out.println(Arrays.asList(names));//转发换成列表输出 HttpServletRequest对象中是把查询字符存储成一个查询字符串的Map集合 //查询字符串在request当中本质是存储为Map集合,用以下方法可取出 MapString,String[]> params = req.getParameterMap(); String[] namePamrams = params.get("name");//取到name属性值的集合 System.out.println(Arrays.asList(namePamrams));//转换成列表输出 String[] sexParams = params.get("sex"); System.out.println(Arrays.asList(sexParams));//转换成列表输出 输出: ![在这里插入图片描述][20190813201337495.png] 可以看出,实际map中存的每个属性的值都是一个字符串数组,那么getParameter(“…”)方法实际是返回某属性的值集合中的第一个元素,getParameterValues("…")则是返回属性原本的字符串集合 #### 1.1.4.HttpServletRequest获取表单数据 #### 1.定义表单 html> head> meta charset="gb2312"/> title>测试表单/title> script type="text/javascript" src="js/jquery-3.4.1.min.js">/script> script type="text/javascript" src="js/js.js">/script> /head> body> form method="post" action="/form"> 帐号:input type="text" name="name"/>br/> 密码:input type="password" name="pwd"/>br/> 性别:input type="radio" name="sex" value="男" checked/>男 input type="radio" name="sex" value="女"/>女br/> 爱好:input type="checkbox" name="fav" value="吹"/>吹 input type="checkbox" name="fav" value="拉"/>拉 input type="checkbox" name="fav" value="弹"/>弹 input type="checkbox" name="fav" value="唱"/>唱br/> 年份:select name="year">/select>br/> 描述:textarea name="desc" rows="8" cols="20">/textarea>br/> input type="submit"/>input type="reset"/> /form> /body> /html> 2.创建Servlet package edu.xalead; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Arrays; public class FormServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //取表单中的数据 String name = request.getParameter("name");//取name属性的值 String pwd = request.getParameter("pwd");//取pwd属性的值 String sex = request.getParameter("sex");//取sex属性的值 String[] fav = request.getParameterValues("fav");//取fav属性值的集合 String year = request.getParameter("year");//取year属性的值 String desc = request.getParameter("desc");//取desc属性的值 System.out.println(name + ":" + pwd + ":" + sex + ":" + Arrays.asList(fav) + ":" + year + ":" + desc); } } 3.web.xml添加servlet配置 ?xml version="1.0" encoding="UTF-8"?> web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> !--.....--> servlet> servlet-name>FormServlet/servlet-name> servlet-class>edu.xalead.FormServlet/servlet-class> /servlet> servlet-mapping> servlet-name>FormServlet/servlet-name> url-pattern>/form/url-pattern> /servlet-mapping> !--.....--> /web-app> 4.注意在表单中添加action请求的servlet路径,要和web.xml中配置的servlet路径一致 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNDE2MjI2_size_16_color_FFFFFF_t_70] ![在这里插入图片描述][20190813201944685.png] ### 1.2.Servlet处理Web响应 ### 处理响应是由HttpServletResponse对象操作,我们可以利用这个对象,在向客户发送的响应中添加我们希望格式化的内容 #### 1.2.1.HttpServletResponse对象向响应头中添加文本信息 #### 利用getWriter()方法获得文本流,这个是向响应体中添加文本的,实际就是在写HTML文档字符 //向响应体中(html页面)添加字符数据(html页面) response.getWriter().println("<html>"); response.getWriter().println("<head>"); response.getWriter().println("<title>动态页面</title>"); response.getWriter().println("</head>"); response.getWriter().println("<body>"); response.getWriter().println(name + ":" + pwd + ":" + sex + ":" + Arrays.asList(fav) + ":" + year + ":" + desc); response.getWriter().println("</body>"); response.getWriter().println("</html>"); #### 1.5.2.2.HttpServletResponse对象向响应体中添加字节数据 #### 利用getOutputStream()方法获得字节流,就可以向客户端发送字节数据了,字节可以是图片,音频,视频,文件等等 1.创建字节数据比如画一张图片,利用response对象的getOutputStream()字节流把字节写到响应体中 BufferedImage img = new BufferedImage(200,200, BufferedImage.TYPE_INT_ARGB); try { Graphics2D g = (Graphics2D) img.getGraphics(); g.setColor(Color.WHITE); g.drawString("Hello World !",30,80); //imageIo的write()方法,第一个参数是要写的图片内存缓存对象,第二个参数是要格式化的字节格式,第三个是准备用什么类型的字节流写,这里是向响应体中写字节的流 ImageIO.write(img,"jpg",response.getOutputStream()); response.getOutputStream().flush(); } catch (Exception e) { e.printStackTrace(); } 2.向客户端写字节要注意,如果浏览不知道字节是什么类型,不知道如何打开,就会默认打开“另存为”对话框,像图片,音频,视频格式如果你认为浏览器应该能识别并展示播放,则需要在响应头中添加contentType头属性,我们把contentType类型称作mime类型 //添加mime类型,下面两种方式均可,推荐第二种 //response.setHeader("contentType","image/jpg"); response.setContentType("image/jpg"); [20190813195950455.png]: /images/20211101/bcc629d8341a4eacb955e73242e5fa0b.png [20190813200436278.png]: /images/20211101/88aabab4a78c4844bd3b2aa1f331fa58.png [20190813201337495.png]: /images/20211101/7eaa38eaee7144bea1823815c604add8.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNDE2MjI2_size_16_color_FFFFFF_t_70]: /images/20211101/0a2f47711fd743e0a5b3d7491a4db471.png [20190813201944685.png]: /images/20211101/0478773c8ef44758a8a63921c849f08b.png
还没有评论,来说两句吧...