java--HttpServlet
Posted 大树*
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java--HttpServlet相关的知识,希望对你有一定的参考价值。
HttpServlet
但在实际开发中,我们不会直接去实现Servlet接口,因为那样需要覆盖的方法太多, 我们一般创建类继承HttpServlet
实现步骤:
1)创建类继承HttpServlet类
2)覆盖doGet和doPost
3)在web.xml中进行servlet的配置
HttpServletResponse
1.HttpServletResponse概述
我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。service方法中的response的类型是ServletResponse,而doGet/doPost方法的response的类型是HttpServletResponse,HttpServletResponse是ServletResponse的子接口,功能和方法更加强大,今天我们学习HttpServletResponse。
response的运行流程
Http响应
2.通过response设置响应行
1 //设置状态码 2 response.setStatus(405);
3.通过response设置响应头
//添加响应头 response.addHeader("name2", "bianxiutong"); //5秒后跳转百度 response.setHeader("refresh", "5;url=https://baidu.com/"); /*//重定向步骤:1.设置状态码 response.setStatus(302); //2.设置响应头Location response.setHeader("Location", "/Servlet04");*/ //实际开发中,上面的代码不会使用,重定向用一句话搞定 response.sendRedirect("/Servlet04");
4.通过response设置响应体
1 response.getWriter().write("hello dandan...");
案例--文件下载
(1)向浏览器输出一张照片
1 //向客户端输出一张图片 2 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 3 //明确数据源 4 String path=getServletContext().getRealPath("IMG_0152.JPG"); 5 //获得输入流 6 FileInputStream fis=new FileInputStream(path); 7 //明确目的地 8 ServletOutputStream sos=response.getOutputStream(); 9 //复制 10 int len=0; 11 byte[] bytes=new byte[1024]; 12 while((len=fis.read(bytes))!=-1){ 13 sos.write(bytes, 0, len); 14 } 15 //释放资源 16 fis.close(); 17 }
(2)提供下载
1 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 2 //获取要下载的文件名称 3 String filename=request.getParameter("filename"); 4 //response解决中文乱码 5 filename=new String(filename.getBytes("ISO8859-1"),"utf-8"); 6 //要下载的文件类型--客户端会通过文件的MIME类型去区分类型 7 response.setContentType(getServletContext().getMimeType(filename)); 8 //获取请求头中的浏览器信息 9 String agent=request.getHeader("User-Agent"); 10 //复制不同浏览器对文件名编码的代码 11 String filenameEncoder=""; 12 if (agent.contains("MSIE")) { 13 // IE浏览器 14 filenameEncoder = URLEncoder.encode(filename, "utf-8"); 15 filenameEncoder = filenameEncoder.replace("+", " "); 16 } else if (agent.contains("Firefox")) { 17 // 火狐浏览器 18 BASE64Encoder base64Encoder = new BASE64Encoder(); 19 filenameEncoder= "=?utf-8?B?" 20 + base64Encoder.encode(filename.getBytes("utf-8")) + "?="; 21 } else { 22 // 其它浏览器 23 filenameEncoder= URLEncoder.encode(filename, "utf-8"); 24 } 25 //要告知客户端文件的打开方式(下载) 26 response.setHeader("Content-Disposition", "attachment;filename="+filenameEncoder); 27 //获取文件的绝对路径 28 String path=getServletContext().getRealPath("download/"+filename); 29 //获得该文件的输入流 30 FileInputStream fis=new FileInputStream(path); 31 //获取文件输出流 32 ServletOutputStream sos=response.getOutputStream(); 33 //文件复制 34 int len=0; 35 byte[] bytes=new byte[1024]; 36 while((len=fis.read(bytes))!=-1){ 37 sos.write(bytes, 0, len); 38 } 39 //释放资源 40 fis.close(); 41 }
下载html:
<h1>使用服务器端的编码方式实现文件的下载</h1> <a href="/WEB04/DownLoadServlet?filename=IMG_0152.JPG">IMG_0152.JPG</a> <a href="/WEB04/DownLoadServlet?filename=你好.txt">你好.txt</a> <a href="/WEB04/DownLoadServlet?filename=New Folder.zip">New Folder.zip</a> <a href="/WEB04/DownLoadServlet?filename=ServletCOntext.wmv">ServletCOntext.wmv</a>
response细节点:
- response获得的流不需要手动关闭,web容器(tomcat容器)会帮助我们关闭,
- getWriter和getOutputStream不能同时调用
- 重定向语句一般作为终结代码
关于中文乱码问题
https://www.cnblogs.com/-dashu/p/9625892.html
HttpServletRequest
1.HttpServletRequest概述
我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。service方法中的request的类型是ServletRequest,而doGet/doPost方法的request的类型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加强大,今天我们学习HttpServletRequest。
response的运行流程
http请求
2.通过request获得请求行
1 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 2 //1.获取请求方式 3 String method=request.getMethod(); 4 System.out.println("请求方式:"+method); 5 //2.获取请求资源的相关内容 6 String requestURI=request.getRequestURI(); 7 System.out.println("requestURI:"+requestURI); 8 StringBuffer requestURL=request.getRequestURL(); 9 System.out.println("requestURL:"+requestURL); 10 //3.获取WEB应用名称 11 String contextpath=request.getContextPath(); 12 System.out.println("WEB项目名称为:"+contextpath); 13 //4.获取get方式提交url后的参数信息 14 String queryString=request.getQueryString(); 15 System.out.println("get提交参数信息"+queryString); 16 //5.获取客户端的访问者的ip地址 17 String ip=request.getRemoteAddr(); 18 System.out.println("ip地址为:"+ip); 19 }
3.通过request获得请求头
1 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 2 //1.获取指定的头 3 String agent=request.getHeader("User-Agent"); 4 System.out.println(agent); 5 //2.获取所有头的名称 6 Enumeration<String> headerNames=request.getHeaderNames(); 7 while(headerNames.hasMoreElements()){ 8 String headerName=headerNames.nextElement(); 9 String headerValue=request.getHeader(headerName); 10 System.out.println(headerName+"..."+headerValue); 11 } 12 }
1 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 2 //获取referer的信息 3 String refer=request.getHeader("referer"); 4 //解决中文乱码 5 response.setContentType("text/hetml;charset=utf-8"); 6 //对referer进行判断 7 if(refer!=null&& refer.startsWith("http://localhost")){ 8 response.getWriter().write("一、京东重创中国网络零售商京东创始人刘强东涉嫌犯罪事态升级。明尼拿波里斯警察局发言人埃尔德(John Elder)接受电话采访表示,刘强东涉嫌强暴重罪。"); 9 }else{ 10 response.getWriter().write("你是盗链者,可耻"); 11 } 12 }
4.通过request获得请求体
form.jsp:
<form action="/WEB06/ContentServlet" method="post"> 用户名:<input type="text" name="username"><br> <input type="checkbox" name="hobby" value="zq">足球 <input type="checkbox" name="hobby" value="lq">篮球 <input type="checkbox" name="hobby" value="pq">排球 <input type="checkbox" name="hobby" value="ppq">乒乓球 <input type="submit" value="提交"> </form>
servlet:
1 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 2 //获取单个值 3 String username=request.getParameter("username"); 4 //获取指定表单元素的value值 5 String[] hobbys=request.getParameterValues("hobby"); 6 for(String h:hobbys){ 7 System.out.println(h); 8 } 9 //获取所有参数,并封装到一个Map<String,String[]>中 10 Map<String,String[]> map=request.getParameterMap(); 11 for(Map.Entry<String,String[]> entry:map.entrySet()){ 12 //参数的name值 13 System.out.println(entry.getKey()); 14 //参数value值(String[]) 15 for(String str:entry.getValue()){ 16 System.out.println(str); 17 } 18 System.out.println("-----------------"); 19 } 20 }
5.request的其他功能
(1)request是一个域对象
//往域对象中设置值 request.setAttribute("name", "张三"); //中文乱码 response.setContentType("text/hetml;charset=utf-8"); //获取域对象值 String name=(String)request.getAttribute("name"); response.getWriter().write(name);
(2)request完成请求转发
//请求转发--获得转发器、通过转发器转发 request.getRequestDispatcher("/Servlet2").forward(request, response);
转发与重定向的区别?
1)重定向两次请求,转发一次请求
2)重定向地址栏的地址变化,转发地址不变
3)重新定向可以访问外部网站 转发只能访问内部资源
4)转发的性能要优于重定向
注意:ServletContext域与Request域的生命周期比较?
ServletContext:
创建:服务器启动
销毁:服务器关闭
域的作用范围:整个web应用
request:
创建:访问时创建request
销毁:响应结束request销毁
域的作用范围:一次请求中
注意:客户端地址与服务器端地址的写法?
客户端地址:
是客户端去访问服务器的地址,服务器外部的地址,特点:写上web应用名 称
直接输入地址:重定向
服务器端地址:
服务器内部资源的跳转的地址,特点:不需要写web应用的名称
请求转发
以上是关于java--HttpServlet的主要内容,如果未能解决你的问题,请参考以下文章
Maven 项目报错 java.httpservlet 和synchronized使用