Servlet

Servlet

Servlet

  • Servlet是Java提供的一门动态的web资源开发技术

  • servlet是javaEE规范之一,其实就是一个接口,将来我们需要定义servlet类实现servlet接口,并由web服务器运行servlet

快速入门

  1. 创建web项目,导入servlet依赖坐标

  2. 创建:定义一个类,实现servlet接口,并重写接口中的方法,并在servlet方法中输入一句话

  3. 配置:在类上使用@WebServlet注解,配置该Servlet的访问路径

  4. 访问:启动Tomcat,浏览器输入URL访问Servlet

servlet执行流程

  • Servlet由web服务器创建,Servlet方法由web服务器调用。

  •  

servlet生命周期

生命周期:一个对象从被创建到被销毁的过程

 

servlet体系结构

Servlet体系结构

servlet

GenericServlet

HttpServlet

  • Servlet ——Servlet体系根接口

  • GenneriServlet——Servlet抽象实现类

  • HttpServlet——对HTTP协议封装的Servlet是实现类

开发B/S架构的web项目都是正对http协议的,所以自定义servlet会继承HttpServlet

get和post请求方式是在表单里面设置的,默认是get请求方式

需要根据请求方式的不同分别进行处理

  1. 先后获取请求方式

    HttpServletRequest request= (HttpServletRequest) servletRequest;//强制类型转换

    String method=request.getMethod();//获取请求方式

  2. 判断

    //对获取的method进行判断

    if(“GET”.equals(method)){

    // get请求的处理方式

    }else if(“POST”.equals(method)){

    // post请求的处理方式

    }

HttpServlet的使用步骤

  • 继承HttpServlet

  • 重写doGet和doPost方法

HttpServlet原理

  • 获取请求方式,并根据不同的请求方式调用不同的方法

Servlet的方法

  • 初始化方法,在Servlet被创建时执行,只执行一次

    void init(ServletConfig config)

  • 提供服务的方法,每次Servlet被访问都会调用该方法

    void service(ServletRequest req,ServletResponse res)

  • 销毁方法,当servlet被销毁时,调用该方法,在内存释放或服务器关闭时销毁servlet

    void destroy()

  • 获取ServletConfig对象

    ServletConfig getServletConfig()

  • 获取Servlet信息

    String getServletInfo()

 

servlet urlPattern配置

 

  • servlet要想被访问,必须配置访问路径(urlPattern

  1. 一个Servlet,可以配置多个urlPattern

    @WebServlet(urlPattern={“/demo1”,”/demo2”})

  2. usrPattern配置规则

    1. 精确匹配

    2. 目录匹配

    3. 扩展名匹配

    4. 任意匹配

 

XML配置方式编写servlet

  • servlet从3.0开始支持使用注解配置

  • 步骤

    1. 编写servlet类

    2. 在web.xml中配置该Servlet

 

 

Request和Response

Request(请求)——获取请求数据

Response(响应)——设置响应数据

使用Request对象获取请求数据

String name=request.getParameter(“name”);——这样就获取了表单里面input输入的内容,input标签需要设置name属性和属性值,Request对象里的方法里填写的就是input标签设置的那么属性的属性值

使用Response对象设置响应的数据

response.setHeader(“content-type”,”text/html;charset=utf-8“);//设置页面的编码格式

response.getWrite().write(“

”+name+“

”);在空白的页面上写上标签,获取的表单值也在页面上显示

Request

Request继承体系

RequestFacade

HttpServletRequest

ServletRequest

  • ServletRequest是Java提供的请求对象根接口

  • HttpServletRequest是java提供的http协议封装的请求对象接口

  • RequestFacade是Tomcat定义的实现类

  1. Tomcat需要解析请求数据,封装为request对象,并且request对象传递到service方法中

  2. 使用request对象,查阅javaEE API文档的HttpServletRequest接口

Request获取请求数据

  • 请求数据分为3部分:

  1. 请求行——GET/request-demo/req1?username=zhangHTTP/1.1

    • String getMethod():获取请求方式:GET

    • String getContextPath():获取虚拟目录(项目的访问路径):/request-demo

    • StringBuffer getRequestURL():获取URL:http://localhost:8080/request-demo/req1

    • String getRequestURI():获取URI(统一资源标识符):/request-demo/req1

    • String getQueryString():获取请求参数(GET方式):username=zhang

     

  2. 请求头——User-Agent:Mozilla/5.0 Chrome/91.0.4472.106

    • String getHeader(String name):根据请求头名称获取值

  3. 请求体——只有post请求才有请求体username=123456&password=23456

    • ServletInputStream getInputStream():获取字节输入流(post请求方式)

    • BufferedReader getReader():获取字符输入流(post请求方式)

Request通用方式获取请求参数

get和post都可以使用的获取请求参数的方式:


 

  • Map<String,String[ ]>getParameterMap();——获取所有参数Map集合

    image-20221107142515607

  • String[ ] getParameterValues(String name);——根据名称获取具体的参数值(数组)(即form表单里面name的属性值进行获取对应值)

     

  • String getParameter(String name):——根据name属性值进行获取对应的具体值,单个参数值

以上三种获取请求参数都适用于get和post请求方式

解决中文乱码的问题

这一行代码可以直接解决乱码问题:GET请求只有这种方式进行解决乱码的问题

usename=new String(usename.getBytes(StandardCharsets.ISO_8859_1),StandardCharsets.UTF_8);

Request请求转发

  • 请求转发(forward):是一种在服务器内部的资源跳转方式

  • 实现方式:

    req.getRequestDispatcher(“资源B路径”).forward(req,resp);

  • 请求转发资源间共享数据:使用Request对象

    • void setAttribute (String name,Object o):存储数据到request域中

      在跳转的servlet里设置

      req.setAttribute("msg","我是你爸爸");

      req.getRequestDispatcher(“/servlet-demo”).forward(req,resp);

      // 另一个servlet中获取数据 Object msg = req.getAttribute("msg");

      System.out.println(msg);

    • Object getAttribute(String name):根据key,获取值

    • void removeAttribute(String name):根据key,删除该键值对

请求转发的特点

  • 浏览器地址栏不发生改变

  • 只能转发到当前服务器的内部资源

  • 一次请求,可以在转发的资源间使用request共享数据

Response

  • response:使用response对象来设置响应数据

Response的体系结构和Request一样

RequestFacade

HttpServletRequest

ServletRequest

  • ServletRequest是Java提供的请求对象根接口

  • HttpServletRequest是java提供的http协议封装的请求对象接口

  • RequestFacade是Tomcat定义的实现类

Response设置响应数据功能介绍

  • 响应数据分为3部分:

    • 响应行:HTTP/1.1 200 OK

      void setStatus(int sc):设置响应状态码

    • 响应头: Content-Type:text/html

      void setHeader(String name,String value):设置响应头键值对

    • 响应体:<html><head><body></body></head></html>

      PrintWriter getWriter():获取字符输出流

      ServletOutputStream getOutputStream():获取字节输出流

 

Response完成重定向

  • 重定向(Redirect):一种资源跳转方式

浏览器请求资源A,资源A处理不了,报状态码302,提示浏览器请求到资源B进行处理,并将资源B的位置告知浏览器响应头:location:资源B的路径

  • 实现方式

    resp.setStatus(302);

    resp.setHeader(“location”,“虚拟目录/资源B的路径”)//location是固定的

    —————简化重新向———————————–

    response.sendRedirect("虚拟目录/资源B的路径");

  • 重定向的特点(与请求转发完全相反)

    • 浏览器地址栏发生变化

    • 可以重定向到任意位置的资源(服务器内部、外部均可)

    • 两次请求,不能在多个资源使用request共享数据

路径问题

  • 明确路径使用者

    • 浏览器使用:需要加虚拟目录

    • 服务器使用:不需要加虚拟目录

动态获取虚拟目录

String contextPath=request.getContextPath();

response.sendRedirect(contextPath+"/资源B的路径");


Response响应字符数据

  • 使用

    1. 通过Response对象获取字符输出流

      PrintWriter write=resp.getWriter();

    2. 写数据

      write.write(“<a href='https://www.baidu.com/'>百度</a>>”);——可以写一些html的标签和纯文本,要写html标签必须要设置response.setContentType("text/html;charset=utf-8");

  • 流不需要关闭,随着response对象的销毁,由服务器关闭

  • response.setContentType("text/html;charset=utf-8");——设置响应的数据格式和字符集

Response响应字节数据

  • 使用

    1. 通过Response对象获取字符输出流

      ServletOutputStream outputStream=resp.getOutputStream();

    2. 写数据

      outputStream.write(字节数据);

  • 使用工具类IOUtils

    • 导入坐标

    • 使用

       

response可以抓取图片等媒体数据,注意的是不要改变写入的ContentType的类型,即不使用response.setContentType("txt/html;charset=utf-8");否则图片会变成乱码

 

 

案例——登录和注册

登录和注册HTML页面

实体类文件

 

登录提交的servlet代码

注册servlet代码

Mapper接口文件

sql映射文件

mybatis配置文件

  • 问题

    • 代码重复

    • SqlSessionFactory工厂只能创建一次,不要重复创建,在login和register两个servlet文件中都创建这个工厂了,这样是不行的,会消耗内存,所以需要进一步优化

  • 优化:创建一个工具类

要是使用这个工具类只需要在servlet文件将


String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);


替换成以下代码即可:

SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();

Leave a Reply

Your email address will not be published. Required fields are marked *

Other My Posts