servlet

    科技2022-07-14  125

    servlet

    1.xml头部

    <?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" metadata-complete="true"> </web-app>

    2.一个servlet对应一个映射

    <!--注册servlet--> <servlet> <servlet-name>helloservlet</servlet-name> <servlet-class>com.liu.servlet.HelloServlet</servlet-class> </servlet> <!--一个servlet对应一个映射--> <servlet-mapping> <servlet-name>helloservlet</servlet-name> <url-pattern>/liu</url-pattern> </servlet-mapping>

    3.编写Servlet步骤

    3.1编写普通类继承HttpServlet

    public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("UTF-8"); resp.setContentType("text/html;charset=UTF-8"); PrintWriter out = resp.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>Hello world</title>"); out.println("</head>"); out.println("<body>"); out.println("<body>"); out.println("<h1>通过 servlet访问到的" + "</h1>"); out.println("</body>"); out.println("</html>"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }

    3.2配置web.xml做映射

    <!--注册servlet--> <servlet> <servlet-name>helloservlet</servlet-name> <servlet-class>com.liu.servlet.HelloServlet</servlet-class> </servlet> <!--一个servlet对应一个映射--> <servlet-mapping> <servlet-name>helloservlet</servlet-name> <url-pattern>/liu</url-pattern> </servlet-mapping>

    3.3开启Tomcat访问 映射路径

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xbOFYxkt-1601788593301)(D:\qq7A5F538EF54A10976ECE4E8BF7624F3B\aa6a503262174fc69b77459495b2ec98\clipboard.png)]

    4.Mapping问题

    一个servlet指定一个映射一个servlet指定多个映射一个servlet指定通用映射一个servlet指定前后缀等…

    4.1一个servlet指定一个映射

    <!--注册servlet--> <servlet> <servlet-name>helloservlet</servlet-name> <servlet-class>com.liu.servlet.HelloServlet</servlet-class> </servlet> <!--一个servlet对应一个映射--> <servlet-mapping> <servlet-name>helloservlet</servlet-name> <url-pattern>/liu</url-pattern> </servlet-mapping>

    4.2一个servlet指定多个映射

    <!--注册servlet--> <servlet> <servlet-name>helloservlet</servlet-name> <servlet-class>com.liu.servlet.HelloServlet</servlet-class> </servlet> <!--一个servlet对应一个映射--> <servlet-mapping> <servlet-name>helloservlet</servlet-name> <url-pattern>/liu</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>helloservlet</servlet-name> <url-pattern>/liu2</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>helloservlet</servlet-name> <url-pattern>/liu3</url-pattern> </servlet-mapping>

    4.3一个servlet指定通用映射

    liu没有写的话,是默认访问路径

    <servlet-mapping> <servlet-name>helloservlet</servlet-name> <url-pattern>/liu/*</url-pattern> </servlet-mapping>

    4.4一个servlet指定前后缀等…

    “星号”前面不能加映射的路径

    aslfhas.liu <servlet-mapping> <servlet-name>helloservlet</servlet-name> <url-pattern>*.liu</url-pattern> </servlet-mapping>

    5.ServletContext

    web容器在启动的时候,它会为每个web应用都创建一个ServletContext对象,它代表当前对象的web应用

    共享数据

    一个servlet保存的数据,可以在另外一个servlet中拿到

    1设置传参

    //设置传参 public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("ok"); ServletContext servletContext = this.getServletContext(); String name = "luz"; servletContext.setAttribute("username",name); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }

    2设置接参

    public class GetServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext servletContext = this.getServletContext(); String username = (String) servletContext.getAttribute("username"); req.setCharacterEncoding("UTF-8"); resp.setContentType("text/html;charset=UTF-8"); resp.getWriter().println("username:"+username); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }

    3.配置web.xml

    <servlet> <servlet-name>hello</servlet-name> <servlet-class>com.liu.servlet.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> <servlet> <servlet-name>getContext</servlet-name> <servlet-class>com.liu.servlet.GetServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>getContext</servlet-name> <url-pattern>/getContext</url-pattern> </servlet-mapping>

    4.测试结果

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fWJVTcbE-1601788593305)(D:\qq7A5F538EF54A10976ECE4E8BF7624F3B\d48e0fee16de4b329954a64ccdbdede2\clipboard.png)]

    6、HttpServletResponse

    web服务器接收客户端的http请求,针对这个请求,分别创建一个代表HttpServletReuest对象,代表响应的一个httpservletrequest;

    获取客户端请求参数:httpservletrequest给客户端响应参数:HttpServletResponse

    6.1下载文件

    1.获取下载路径

    2.获取下载文件名

    3.获取下载文件输入流

    4.设置想办法浏览器能够支持下载需要的东西

    5.创建缓冲区

    6获取OutPutStream对象

    7.将FileOutputStream流写入到buffer缓冲区

    8.使用OutputStream将缓冲区的数据输出到客户端

    public class FileServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 1.获取下载路径 String realPath ="D:\\学习\\web\\课程代码\\kuang-JavaWeb-servlet\\response\\src\\main\\resources\\刘.png"; // 2.获取下载文件名 String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1); // 3.设置想办法浏览器能够支持下载需要的东西(文件url中文处理) resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8")); // 4.获取下载文件输入流 FileInputStream inputStream = new FileInputStream(realPath); // 5.创建缓冲区 int len = 0; byte[] buffer = new byte[1024]; // 6.获取OutPutStream对象 ServletOutputStream outputStream = resp.getOutputStream(); // 7.将FileOutputStream流写入到buffer缓冲区,使用OutputStream将缓冲区的数据输出到客户端 while ((len=inputStream.read(buffer))>0){ outputStream.write(buffer,0,len); } // 9.关闭流 inputStream.close(); outputStream.close(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }

    6.2验证码功能

    package com.liu.servlet; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.awt.*; import java.awt.image.BufferedImage; import java.io.FileInputStream; import java.io.IOException; import java.net.URLEncoder; import java.util.Random; /** * @author lzc * @date 2020-8-15 16:00 * 描述: */ public class ImageServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //让浏览器5秒中刷新一次 resp.setHeader("refresh","5"); //在内存中创建图片 BufferedImage bufferedImage = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB); //得到图片 Graphics2D graphics = (Graphics2D) bufferedImage.getGraphics(); //设置图片颜色等 graphics.setColor(Color.white); graphics.fillRect(0,0,80,20); //给图片写数据 graphics.setColor(Color.BLUE); graphics.setFont(new Font(null,Font.BOLD,20)); graphics.drawString(makeNum(),0,20); //告诉浏览器,这个请求用图片方式打开 resp.setContentType("image/png"); //网站存在缓存,不让浏览器缓存 resp.setDateHeader("expires",-1); resp.setHeader("Cache-Control","no-cache"); resp.setHeader("Prama","no-cache"); //把图片写给浏览器 ImageIO.write(bufferedImage,"png",resp.getOutputStream()); } //生成随机数 private String makeNum(){ Random random = new Random(); String num = random.nextInt(9999999)+""; StringBuffer stringBuffer = new StringBuffer(); for (int i = 0; i <7-num.length() ; i++) {//7-num.length() 保证验证码7位,如果不够就0填充 stringBuffer.append("0"); } num = stringBuffer.toString() + num; return num; } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }

    测试结果

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sqGHvttP-1601788593307)(D:\qq7A5F538EF54A10976ECE4E8BF7624F3B\1b6779d730b144039996a2debfdd241e\clipboard.png)]

    7.HttpServletRequest

    代表客户端的请求,用户通过http协议访问服务器,请求的所有信息会被封装到HttpServletRequest中。

    8.Cookie

    8.1保存用户上一次访问的时间

    public class CookieServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //中文乱码 req.setCharacterEncoding("UTF-8"); resp.setContentType("text/html;charset=UTF-8"); PrintWriter out = resp.getWriter(); //服务器从客户端获取cookie Cookie[] cookies = req.getCookies(); //判断cookie是否存在 if (cookies!=null){ out.write("你上次访问时间:"); //遍历 for (int i = 0; i <cookies.length ; i++) { Cookie cookie = cookies[i]; //获取cookie名字 if (cookie.getName().equals("lastTime")){ //获取cookie的值 long lastTime = Long.parseLong(cookie.getValue());//cookie转long Date date = new Date(lastTime);//long转date out.write(date.toLocaleString()); } } }else { out.write("cookie为空"); } //服务器给客户端响应一个cookie Cookie cookie = new Cookie("lastTime", String.valueOf(System.currentTimeMillis())); cookie.setMaxAge(24*60);//设置cookie有效时间 resp.addCookie(cookie); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }

    测试结果

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ma23E5gH-1601788593310)(D:\qq7A5F538EF54A10976ECE4E8BF7624F3B\0a668158116a4305a4b9f26db3ca8ef4\clipboard.png)]

    9.session

    什么是Session;

    服务器会给每一一个用户(浏览器)创建一个Seesion对象;一个Seesion独占一个浏览器,只要浏览器没有关闭,这个Session就存在; .用户登录之后,整个网站它都可以访问! ->保存用户的信息;保存购物车的信息…

    session和cookie的区别

    Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)Session把用户的数据写到用户独占Session中,服务器端保存(保存重要的信息, 减少服务器资源的浪费)Session对象由服务创建;

    使用场景:

    保存一个登录用户的信息;购物车信息;在整个网站中经常会使用的数据,我们将它保存在Session中;

    会话自动过期

    <!--设置session--> <session-config> <!--超时1分钟失效--> <session-timeout>1</session-timeout> </session-config>

    10.过滤器Filter

    10.1步骤

    导包

    <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> </dependency> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency>

    编写过滤器

    public class CharacterEncodingFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=UTF-8"); chain.doFilter(request,response);//放行 }

    配置servlet、filter

    <servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>com.liu.servlet.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/HelloServlet</url-pattern> </servlet-mapping> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>com.liu.filter.CharacterEncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <!--访问HelloServlet下的路径会经过这个过滤器--> <url-pattern>/HelloServlet/*</url-pattern> </filter-mapping>

    11、监听器

    11.1步骤

    实现接口

    public class OnlineCountListener implements HttpSessionListener { @Override public void sessionCreated(HttpSessionEvent se) { ServletContext servletContext = se.getSession().getServletContext(); Integer onlineCount = (Integer) servletContext.getAttribute("OnlineCount"); if (onlineCount==null){ onlineCount = new Integer(1); }else{ int count = onlineCount.intValue(); onlineCount= new Integer(count++); } servletContext.setAttribute("OnlineCount",onlineCount); } @Override public void sessionDestroyed(HttpSessionEvent se) { ServletContext servletContext = se.getSession().getServletContext(); Integer onlineCount = (Integer) servletContext.getAttribute("OnlineCount"); if (onlineCount==null){ onlineCount = new Integer(0); }else{ int count = onlineCount.intValue(); onlineCount= new Integer(count--); } servletContext.setAttribute("OnlineCount",onlineCount); } }

    2.配置监听器

    <listener> <listener-class>com.liu.listener.OnlineCountListener</listener-class> </listener>

    ttribute(“OnlineCount”); if (onlineCount==null){ onlineCount = new Integer(0); }else{ int count = onlineCount.intValue(); onlineCount= new Integer(count–); } servletContext.setAttribute(“OnlineCount”,onlineCount); } } ```

    #### 2.配置监听器 ```java <listener> <listener-class>com.liu.listener.OnlineCountListener</listener-class> </listener> ```
    Processed: 0.018, SQL: 8