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);
复制代码- <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">
- 密码:<input type="password" name="password">
- <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中
[code][/code]必须放在第一行
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |