Java Web之路(二)Servlet之HttpServletResponse和HttpServletRequest
HttpServletResponse
1.告诉服务器应用使用UTF-8解析文本的两种方式,告诉客户端要使用什么编码
1 2 | response.setHeader( "content-type" , "text/html;charset=UTF-8" ); response.setContentType( "text/html; charset=UTF-8" ); |
2.getWriter
1 2 | PrintWriter out = response.getWriter(); //得到一个字符输出流 out.write( "你好!" ); //向客户端响应文本内容 |
3.getOutputStream
1 2 3 | response.setContentType( "text/html;charset=UTF-8" ); ServletOutputStream sos = response.getOutputStream(); sos.write( "你好123" .getBytes( "UTF-8" )); //getBytes默认编码为本地编码(即:gbk) |
4.下载文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //通过路径得到一个输入流 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(); } |
5.告诉客户端不使用缓存
1 2 3 | response.setHeader( "pragma" , "no-cache" ); response.setHeader( "cache-control" , "no-cache" ); response.setIntHeader( "expires" , 0 ); |
6.跳转
1 2 3 4 5 6 7 8 9 10 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType( "text/html;charset=UTF-8" ); /*response.setIntHeader("refresh", 1);//设置1秒钟刷新一次 Random r = new Random(); response.getWriter().write(r.nextInt()+"");*/ response.getWriter().write( "注册成功!3秒钟跳到主页" ); //设置3秒钟跳转 response.setHeader( "refresh" , "3;url=/day09_reques_response/demo6" ); } |
7.重定向
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println( "A:我要借钱!" ); System.out.println( "B:我不有,但是我可以告诉你谁有" ); /*//告诉客户端要重新定向新的资源 response.setStatus(302); //告诉浏览器要去访问哪个URL response.setHeader("location", "/day09_00_HttpServletResponse/servlet/demo8");*/ //请求重定向 response.sendRedirect( "/day09_reques_response/demo8" ); System.out.println( "A: 我去了" ); } |
8.response细节
getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter对象。
getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。 会抛异常。
Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态
行和各响应头组合后输出到客户端。
Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关
闭该输出流对象。
HttpServletRequest
1.request常用方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 获得客户机信息 getRequestURL方法返回客户端发出请求时的完整URL。 getRequestURI方法返回请求行中的资源名部分。 getQueryString 方法返回请求行中的参数部分。 getRemoteAddr方法返回发出请求的客户机的IP地址 getRemoteHost方法返回发出请求的客户机的完整主机名 getRemotePort方法返回客户机所使用的网络端口号 getLocalAddr方法返回WEB服务器的IP地址。 getLocalName方法返回WEB服务器的主机名 getMethod得到客户机请求方式 获得客户机请求头 getHead(name)方法 getHeaders(String name)方法 getHeaderNames方法 获得客户机请求参数(客户端提交的数据) getParameter(name)方法 getParameterValues(String name)方法 getParameterNames方法 getParameterMap方法 //做框架用,非常实用 getInputStream |
代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //test1(request); //test2(request); //获得相关name的消息头 Enumeration headers = request.getHeaders( "accept-language" ); while (headers.hasMoreElements()){ String e = (String) headers.nextElement(); System.out.println(e+ ":" +request.getHeader(e)); } } private void test2(HttpServletRequest request) { //获得所有请求消息头的name Enumeration names = request.getHeaderNames(); while (names.hasMoreElements()){ String e = (String) names.nextElement(); System.out.println(e+ ":" +request.getHeader(e)); } } private void test1(HttpServletRequest request) { //获得请求消息头的信息 String header = request.getHeader( "User-Agent" ); System.out.println(header); if (header.toLowerCase().contains( "msie" )){ System.out.println( "你使用的是IE浏览器" ); } else if (header.toLowerCase().contains( "firefox" )){ System.out.println( "你使用的是火狐浏览器" ); } else if (header.toLowerCase().contains( "chrome" )){ System.out.println( "你使用的是谷歌浏览器" ); } else { System.out.println( "你使用的是其它浏览器" ); } } |
2.获得参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | private void test1(HttpServletRequest request) throws UnsupportedEncodingException { //获取表单数据 //根据表单中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); } |
1 2 3 4 5 6 7 8 9 10 11 | private void test2(HttpServletRequest request) { //获取所有的表单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]); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | private void test3(HttpServletRequest request) { 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(); } } |
依赖包commons-beanutils-1.8.3.jar和commons-logging-1.1.1.jar
1 2 3 4 5 6 7 8 9 10 | private void test4(HttpServletRequest request) { try { User u = new User(); System.out.println( "封装数据前:" +u); BeanUtils.populate(u, request.getParameterMap()); System.out.println( "封装数据后:" +u); } catch (Exception e) { e.printStackTrace(); } } |
3.请求转发(请求一次)
1 | request.getRequestDispatcher( "/demo6" ).include(request, response); |
写入需要传递的值
1 2 | //将非表单的数据添加到request的域中 request.setAttribute( "s" , str); |
获取传过来的值
1 2 3 4 | //将request对象中的移除 //request.removeAttribute("s"); //从request对象中获取s的值 String s = (String) request.getAttribute( "s" ); |
4.重定向(请求两次)
1 2 3 4 5 6 7 8 | //将请求转发到demo6中 //request.getRequestDispatcher("/servlet/demo6").forward(request, response); //注:请求转发不能跳转到其它应用 //request.getRequestDispatcher("http://www.baidu.com").forward(request, response); //使用重定向 //response.sendRedirect(request.getContextPath()+"/servlet/demo6"); //可以跳转到其它应用 //response.sendRedirect("http://www.baidu.com"); |
5.请求包含
1 2 | //请求包含 request.getRequestDispatcher( "/demo6" ).include(request, response); |
6.解决乱码
1 2 | request.setCharacterEncoding( "UTF-8" ); //只能解决post方式的乱码 userName = new String(userName.getBytes( "iso-8859-1" ), "UTF-8" ); //解决get乱码 |
分类:
【109】Java Web基础
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!