Servlet重要类及其方法的应用
Servlet重要类及其方法的应用
Servlet重要类及其方法的应用
1.1 HttpServlet的一些方法介绍
// this.getInitParameter();得到初始化参数
// this.getServletConfig();得到servlet配置就是web.xml中我们写的配置
// this.getServletContext();得到servlet上下文
1.2 ServletContext
web容器(tomcat)在启动的时候,它会为每个web程序创建一个对应的ServletContext对象,它代表当前的web应用。
作用:
-
共享数据:不同servlet之间(类似vue的store)
//第一个servlet中 ServletContext servletContext = this.getServletContext(); String username = "lihua"; //将数据保存在其中,通过第一个参数取出数据,第二个参数是值 servletContext.setAttribute("username",username); //另外一个servlet ServletContext servletContext2 = this.getServletContext(); String username = (String) //取出 servletContext2.getAttribute("username"); //设置格式 resp.setContentType("text/html;charset=utf-8") //打印到响应中 resp.getWriter().print(username);
- 获取初始化参数
<!--在web.xml中--> <!-- 配置一些web应用初始化参数:就是一些键值对--> <context-param> <param-name>url</param-name> <param-value>jdbc:mysql://localhost:3306/mybatis</param-value> </context-param>
//获取初始化参数 ServletContext servletContext = this.getServletContext(); String url = servletContext.getInitParameter("url"); //jdbc:mysql://localhost:3306/mybatis
-
请求转发
ServletContext servletContext = this.getServletContext(); //需要转发的请求路径 RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("/hello"); requestDispatcher.forward(req,resp);//实现请求转发 //合并前两句 // servletContext.getRequestDispatcher("/hello").forward(req,resp);
现在本servlet路径显示的是/hello路径的页面
-
读取资源文件
Properties:
- 在java目录下新建properties(如db.properties)
- 在resources目录下新建properties
发现都被打包到同一个路径下:classes,俗称类路径
ServletContext servletContext = this.getServletContext(); //把资源变成流 InputStream resourceAsStream = servletContext.getResourceAsStream("/WEB-INFO/classes/db.properties"); Properties properties = new Properties(); properties.load(resourceAsStream); String username = properties.getProperty("username"); //得到:helloworld //db.properties中: username=helloworld
1.3 HttpServletResponse
web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpsServletRequest代表,代表响应的一个HttpServletResponse
- 如果要获取客户端请求过来的参数,找HttpServletRequest
- 如果要给客户端响应一些信息,找HttpServletResponse
简单分类方法:
-
负责向浏览器发送信息的方法
-
getOutputStream()//字节流 getWriter()//字符,用来写中文等 //这些方法都是继承自ServletResponse
-
-
负责向浏览器发送响应头的方法
-
setCharacterEncoding(String charset) setContentLength(int len) setContentLengthLong(long len) setContentType(String type) //上述方法继承自ServletResponse addDateHeader(String name, long date) setHeader(String name, String value) addHeader(String name, String value) setIntHeader(String name, int value) addIntHeader(String name, int value) //这些是自己类的方法,而且不止这些
-
-
响应码和设置响应码的方法
一些应用:
-
向浏览器输出消息:不多说,上面一直在演示
-
下载文件
// 1.获取下载路径 String realPath ="C:\\Users\\adminster\\Desktop\\雨夜.png"; // 2.获取下载文件名 // 截取字符串获取文件名字 String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1); // 3.想办法让浏览器支持下载(设置响应头) // 如果文件路径有中文的话需要UrlEncoder resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8")); // 4.获取下载文件的输入流 FileInputStream fileInputStream = new FileInputStream(realPath); // 5.创建缓冲区 int len = 0; byte[] bytes = new byte[1024]; // 6.获取OutputStream对象 ServletOutputStream outputStream = resp.getOutputStream(); // 7.将OutputStream流写入缓冲区 while ((len=fileInputStream.read(bytes))>0){ outputStream.write(bytes,0,len); } fileInputStream.close(); outputStream.close(); //最后成功下载文件
-
验证码功能
验证码是怎么来的:
- 前端实现
- 后端实现,需要用到java的图片类生成一个图片
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 让浏览器三秒刷新一次 resp.setHeader("refresh","3"); // 在内存创建一个图片,参数宽高颜色 BufferedImage bufferedImage = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB); // 图片的画笔 Graphics2D graphics2D = (Graphics2D) bufferedImage.getGraphics(); // 设置图片背景颜色 graphics2D.setColor(Color.RED); // 填充图形 graphics2D.fillRect(0,0,80,20); // 给图片写数据 graphics2D.setColor(Color.blue); graphics2D.setFont(new Font(null,Font.BOLD,20)); graphics2D.drawString(makeNum(),0,20); // 告诉浏览器这个请求以图片jpeg的形式打开 resp.setContentType("image/jpeg"); // 网站存在缓存,我们阻止其缓存,下面三行可以不掌握 resp.setDateHeader("expires",-1); // 缓存控制,设置为不缓存 resp.setHeader("Cache-Control","no-cache"); // Pragma resp.setHeader("Pragma","no-cache"); // 把图片写给浏览器,以imageIO的形式 ImageIO.write(bufferedImage,"jpg",resp.getOutputStream()); } private String makeNum(){ Random random = new Random(); // 生成随机数[0,10000000) int ; String s = random.nextInt(10000000) + ""; //以下步骤都是为了当为啥不够七位时补零 StringBuffer sb = new StringBuffer(); for (int i = 0; i < 7 - s.length(); i++) { sb.append("0"); } s = sb.toString() + s; return s; }
效果:同时每三秒刷新一次为不同数字
-
Response重定向(最重要)
至于什么是重定向?感觉说过很多次了,就是web资源收到客户端请求之后,让它去访问另外一个资源的过程
//重定向操作: resp.sendRedirect("/SonMaven_war/img"); //重定向路径不能只写个/img,还需要加上部署的项目名
状态码3开头都是重定向请求
转发和重定向的区别:(131条消息) 请求转发和重定向_豆虫儿的博客-CSDN博客
请求转发:request.getRequestDispatcher(URL地址).forward(request, response)
重定向:response.sendRedirect(URL地址)
重定向之后url地址变化,转发不变
1.4 HttpServletRequest
代表客户端的请求,用户通过Http协议访问服务器,HTTP请求中的所有信息会被封装得到HttpServletRequest
方法介绍一些重要的:
-
获取前端传递的参数
//一个表单,index.jsp中 //修改编码 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <form action="${pageContext.request.contextPath}/hello" method="get"> 用户名:<input type="text" name="username"><br> 密码:<input type="password" name="password"> <br> <input type="submit"> servlet中 // 解决后台中文乱码 req.setCharacterEncoding("utf-8"); // 得到表单参数 String username = req.getParameter("username"); String password = req.getParameter("password"); resp.setCharacterEncoding("utf-8"); // 一组同名的可以用 // String[] password =req.getParameterValues("password")
-
请求转发
// 请求转发,不像重定向不需要写部署项目路径 req.getRequestDispatcher("/error").forward(req,resp); //只改变页面,路径不变
问题一如何解决封装到端口被占用?
打开cmd,输入netstat -aon | find "1099",数字是被占用的端口号,然后打开任务管理器,输入该进程的pid号结束进程
问题二不允许有匹配 [xX][m M][lL] 的处理指令目标
原因web.xml中
<?xml version="1.0" encoding="UTF-8" ?>
必须放在第一行
热门相关:洪荒二郎传 朕 朕 重生当学神,又又又考第一了! 法医娇宠,扑倒傲娇王爷