Servlet简介

  • 狭义上的概念:Servlet接口及其子接口
  • 广义上的概念:实现了Servlet接口的实现类我们都称为Servlet
  • Servlet对象由Servlet容器(如Tomcat)帮我们创建,不需要我们new
  • Servlet的作用是用来处理用户请求的

    创建Servlet的HelloWorld的步骤

  • 1)创建一个动态的Web工程,并创建一个类实现Servlet接口

    1. public class HelloServlet implements Servlet {
    2. @Override
    3. public void init(ServletConfig servletConfig) throws ServletException {
    4. }
    5. @Override
    6. public ServletConfig getServletConfig() {
    7. return null;
    8. }
    9. //处理用户请求的方法
    10. @Override
    11. public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    12. System.out.println("您的请求我已经收到!");
    13. //获取一个打印流
    14. PrintWriter writer = servletResponse.getWriter();
    15. //给浏览器响应一个字符串
    16. // writer.write("Response Success!");
    17. writer.print("Response Success!");
    18. }
    19. @Override
    20. public String getServletInfo() {
    21. return null;
    22. }
    23. @Override
    24. public void destroy() {
    25. }
  • 2)在web.xml配置文件中注册实现类

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    5. version="4.0">
    6. <!--注册Servlet-->
    7. <servlet>
    8. <!--给当前的Servlet起一个名字,可以任意指定,通常我们以类名作为它的名字-->
    9. <servlet-name>HelloServlet</servlet-name>
    10. <!--设置Servlet接口实现类的全类名,Tomcat(Servlet容器)会通过反射技术创建实现类对象-->
    11. <servlet-class>com.atguigu.servlet.HelloServlet</servlet-class>
    12. </servlet>
    13. <!--映射Servlet-->
    14. <servlet-mapping>
    15. <!--指定要引用的Servlet-->
    16. <servlet-name>HelloServlet</servlet-name>
    17. <!--指定要处理的请求的请求地址-->
    18. <!--http://localhost:8080/Web_Servlet/HelloServlet-->
    19. <url-pattern>/HelloServlet</url-pattern>
    20. </servlet-mapping>
    21. </web-app>
  • 3)当发送HelloServlet这个请求之后,服务器会去web.xml中寻找对应的请求地址的映射,然后创建引用的Servlet实现类的实例并调用service()方法处理用户的请求

    Servlet的生命周期

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

  • 体现Servlet生命周期的有以下方法:

    • 构造器
      • 第一次发送请求时被调用,用来创建对象
      • 在整个生命周期过程中只被调用一次,说明Servlet是单例的
    • init()
      • 第一次发送请求时被调用,用来初始化对象
      • 在整个生命周期过程中只被调用一次
    • service()
      • 每次发送请求都会被调用,用来处理用户的请求
      • 在整个生命周期过程中会被调用多次
    • destory()
      • 服务器关闭时调用,用来销毁对象
      • 在整个生命周期过程中只被调用一次

        ServletConfig与ServletContext的作用

  • ServletConfig
    ```java / ServletConfig:代表了Servlet的配置,该对象由Tomcat创建 该对象有以下三个作用: /

//1.获取Servlet的名称 String servletName = servletConfig.getServletName(); System.out.println(“当前Servlet的名称是:”+servletName);

//2.获取Servlet的初始化参数(只有当前Servlet才能获取,其他的Servlet无法获取) String username = servletConfig.getInitParameter(“username”); System.out.println(“当前Servlet的初始化参数username的值是:”+username);

//3.获取ServletContext对象 ServletContext servletContext = servletConfig.getServletContext();

  1. - `ServletContext`<br />
  2. ```java
  3. //ServletContext对象代表了当前Web应用,它也有以下三个作用:
  4. //1.获取当前Web应用的初始化参数(所有的Servlet都可以获取)
  5. String encoding = servletContext.getInitParameter("encoding");
  6. System.out.println("当前Web应用的初始化参数encoding的值是:"+encoding);
  7. //2.获取服务器中资源的真实路径(文件的上传下载时使用)
  8. String realPath = servletContext.getRealPath("/index.html");
  9. System.out.println("项目中的index.html的真实路径是:"+realPath);
  10. //3.ServletContext是一个域对象(下回分解)

请求和响应

  • HttpServletRequest request

    • request代表了浏览器发送给服务器的请求报文,该对象由服务器创建并以参数的形式传入到doGet和doPost方法中,在这两个方法中可以直接使用
    • request的作用
      1. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      2. System.out.println("doPost方法被调用");
      3. //request的作用:
      4. //1.获取请求参数
      5. /*
      6. 请求中文乱码问题的解决方案:
      7. 对于POST请求:
      8. 在第一个获取请求参数之间通过request设置字符集为UTF-8
      9. 对于GET请求
      10. 在Tomcat的配置文件server.xml的第一个Connector标签中添加属性URIEncoding="UTF-8"
      11. */
      12. request.setCharacterEncoding("UTF-8");
      13. String username = request.getParameter("username");
      14. String password = request.getParameter("password");
      15. System.out.println(username);
      16. System.out.println(password);
      17. //2.获取项目的虚拟路径
      18. String contextPath = request.getContextPath();
      19. System.out.println("项目的虚拟路径是:"+contextPath);
      20. //3.转发
      21. //获取转发器
      22. RequestDispatcher requestDispatcher = request.getRequestDispatcher("WEB-INF/success.html");
      23. //进行请求的转发
      24. requestDispatcher.forward(request,response);
      25. }
  • HttpServletResponse response

    • response代表了服务器发送给浏览器的响应报文,该对象由服务器创建并以参数的形式传入到doGet和doPost方法中,在这两个方法中可以直接使用
    • response的作用

      1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      2. System.out.println("doGet方法被调用");
      3. String username = request.getParameter("username");
      4. String password = request.getParameter("password");
      5. System.out.println(username);
      6. System.out.println(password);
      7. //response的作用:
      8. //1.给浏览器响应一个字符串或一个页面
      9. /*
      10. 响应中文乱码问题的解决方案:
      11. 在获取流之前通过response设置响应的内容的类型及字符集UTF-8
      12. */
      13. response.setContentType("text/html;charset=UTF-8");
      14. PrintWriter writer = response.getWriter();
      15. // writer.write("响应成功!");
      16. // writer.write("<!DOCTYPE html>\n" +
      17. // "<html lang=\"en\">\n" +
      18. // "<head>\n" +
      19. // " <meta charset=\"UTF-8\">\n" +
      20. // " <title>响应页面</title>\n" +
      21. // "</head>\n" +
      22. // "<body>\n" +
      23. // " <h1>我是一个非常漂亮的页面!</h1>\n" +
      24. // "</body>\n" +
      25. // "</html>");
      26. //2.重定向
      27. response.sendRedirect("WEB-INF/success.html");
      28. /*
      29. 转发和重定向的区别:
      30. 1.转发发送一次请求;重定向发送两次请求
      31. 2.转发浏览器地址栏地址无变化;重定向浏览器地址栏地址有变化
      32. 3.转发可以访问WEB-INF目录下的资源;重定向不可以访问WEB-INF目录下的资源
      33. 4.转发可以共享request域中的数据;重定向不可以共享request域中的数据
      34. */
      35. }

Web中的路径问题

  • 在转发的情况下,由于地址栏地址无变化,此时如果用相对路径就有可能导致浏览器解析地址出现异常,所以相对路径不靠谱,建议使用绝对路径
  • 什么是绝对路径?

    • 以 / 开头的路径即为绝对路径
    • 那么 / 代表什么意思呢:
      • 如果路径由浏览器解析,那么 / 就代表当前服务器,即 http://localhost:8080/
        • 以下路径由浏览器解析
          • 1)html标签中的路径:如img标签、script标签中的src中的路径;a标签、link标签中href中的路径;form标签中action中的路径等
          • 2)重定向中的路径
      • 如果路径由服务器解析,那么 / 就代表当前Web应用,即 http://localhost:8080/Web_Servlet_Ex/
        • 以下路径由服务器解析
          • 1)web.xml配置文件中url-pattern标签中的路径
          • 2)转发中的路径

            JSP简介

  • 全称:Java Server Pages,Java的服务页面

  • JSP必须要运行在服务器上,不能脱离服务器单独运行
  • JSP本质上就是一个Servlet
  • HTML和Servlet能实现的功能JSP都可以实现

    JSP的运行原理

  • 当我们访问jsp页面时会经历以下步骤:

    • 1)JSP引擎将jsp页面翻译成java文件
    • 2)Java虚拟机将java文件编译成class文件
    • 3)Servlet容器根据对应的类创建对象并调用_jspService()方法处理用户的请求
  • 以访问index.jsp页面为例:
    • 1)JSP引擎将index.jsp页面翻译成index_jsp.java文件
    • 2)Java虚拟机将index_jsp.java文件编译成index_jsp.class文件
    • 3)Servlet根据index_jsp这个类创建对象并调用_jspService()方法处理用户的请求
  • 以后再访问index.jsp页面(前提是没有改变页面中的内容)

    • 直接使用Servlet容器根据index_jsp这个类创建的对象调用_jspService()方法处理用户的请求

      JSP的基本语法

  • JSP脚本片段

    • 格式:<% 里面写Java代码 %>
    • 作用:JSP脚本片段是用来写Java代码的
    • 在JSP页面中可以有多个脚本片段,但是要保证多个脚本片段拼接之后的完整性
      1. <!--JSP的基本语法-->
      2. <%--
      3. 1.JSP脚本片段
      4. 作用:用来在里面写java代码
      5. --%>
      6. <%
      7. for(int i = 0 ; i < 10 ; i++){
      8. //out.write("今天天气好晴朗,处处好风光!");
      9. %>
      10. <h1>今天天气好晴朗,处处好风光!</h1>
      11. <%
      12. }
      13. %>
  • JSP表达式

    • 格式:<%= 对象 %>
    • 作用:用来向浏览器输出对象

      1. <%--
      2. 2.JSP表达式
      3. 作用:用来向浏览器输出对象
      4. --%>
      5. <%="我是通过JSP表达式输出的"%>
      6. <!--3.JSP页面中可用写的注释
      7. 1JSP注释:JSP引擎翻译jsp页面时忽略
      8. 2Java注释:Java虚拟机编译java文件时忽略
      9. 3HTML注释:浏览器解析页面时忽略
      10. -->

      JSP指令

  • 格式:<%@ 指令名 属性名1=”属性值1” 属性名2=”属性值2” %>

  • 常用的指令

    • page指令

      1. <%--JSP指令--%>
      2. <%--
      3. 1.page指令:用来告诉服务器如何解析当前页面
      4. page指令中的属性:
      5. contentType:告诉浏览器内容的类型以及使用什么字符集进行解码
      6. language:设置编程语言,默认值是java,可选值也是java
      7. pageEncoding:设置当前页面使用的字符集
      8. errorPage:设置当当前页面出现异常时要转发的页面
      9. isELIgnored:设置是否忽略EL表达式,默认是false,不忽略,通过我们不修改它
      10. isErrorPage:设置当前页面是否是一个错误页面,默认是false,不是错误页面,
      11. 如果改为true,则可用使用exception对象获取异常信息
      12. import:用来导包
      13. --%>
      14. <%
      15. //int a = 10/0;
      16. %>
    • include指令

<%—2.★include指令:用来将其他页面中的内容包含到当前页面中
file属性:指定要包含的页面的路径
使用include指令实现的包含称为静态包含,静态包含只翻译、编译当前页面,不翻译、编译被包含的页面
—%>

十年修得同船渡


<%@ include file=”/include.jsp”%>

JSP动作标签

  • 格式:
  • 常用的动作标签
    • forward标签
      1. <%--1.forward标签:用来进行请求的转发
      2. paeg属性:指定要转发的地址
      3. --%>
      4. <%--1)不携带参数的转发,此时开始标签和结束标签中不能有任何内容,否则会抛出异常--%>
      5. <%-- <jsp:forward page="/forward.jsp"></jsp:forward>--%>
      6. <%--2)携带参数的转发
      7. 通过param标签携带请求参数:
      8. name属性:指定参数名
      9. value属性:指定参数值
      10. --%>
      11. <jsp:forward page="/forward.jsp">
      12. <jsp:param name="username" value="admin"/>
      13. </jsp:forward>
      14. include标签
      15. <h1>十年修得同船渡</h1>
      16. <%--2.include标签:用来将其他页面中的内容包含到当前页面中
      17. page属性:指定要包含的页面的路径
      18. 通过include标签实现的包含称为动态包含,动态包含既翻译、编译当前页面,也翻译、编译被包含的页面
      19. 什么情况下使用静态包含和动态包含?
      20. 如果被包含的页面是一个静态页面,我们通常使用静态包含;
      21. 如果被包含的页面是一个动态页面,我们通常使用动态包含
      22. --%>
      23. <jsp:include page="/include.jsp"></jsp:include>

|

JSP中的九大隐含对象


- JSP的隐含对象即在jsp页面中不用声明就可以直接使用的对象
- JSP的隐含对象之所以可以直接使用是因为在对应的Java类的_jspService()方法中已经声明了这些对象
- 九大隐含对象分别是:
- pageContext
- 类型:PageContext
- 作用:一个顶九个,通过它可以获取其他八个隐含对象
- 它还是一个域对象
- request
- 类型:HttpServletRequest
- 作用:与Servlet中的request的作用一样
- 它还是一个域对象
- session
- 类型:HttpSession
- 在Servlet中通过request.getSession()获取改对象
- 它还是一个域对象
- application
- 类型:ServletContext
- 在Servlet中通过request.getServletContext()获取该对象
- 它还是一个域对象
- response
- 类型:HttpServletResponse
- 作用:与Servlet中的response作用一样
- config
- 类型:ServletConfig
- 作用:获取当前Servlet的配置信息
- out
- 类型:JspWriter
- 作用:与PrintWriter的作用类似,可以向浏览器响应一些数据
- page
- 类型:Object
- 作用:相当于this,代表当前对象(在jsp中几乎不用)
- exception
- 类型:Throwable
- 作用:获取异常信息。前提是jsp页面是一个错误页面,即jsp页面的page指令中的isErrorPage属性值为true
| | —- |

|

四个域对象


- 域指区域或者说是范围,在JavaWeb中指不同的Web资源(Servlet、jsp页面)
- 由于不同的Web资源之间需要共享数据,所以就有了域对象
- 四个域对象中都维护着一个Map,用来存、取要共享的数据
- 四个域对象都有以下三个方法:
- void setAttribute(String key , Object value)
- 向域对象中添加属性(设置要共享的数据)
- Object getAttribute(String key)
- 根据属性名从域对象中获取属性值(获取要共享的数据)
- void removeAttribute(String key)
- 根据属性名从域对象中移除属性值
| | —- |

  1. <%--
  2. Created by IntelliJ IDEA.
  3. User: 韩总
  4. Date: 2020/2/24
  5. Time: 14:03
  6. To change this template use File | Settings | File Templates.
  7. --%>
  8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  9. <html>
  10. <head>
  11. <title>四个域对象</title>
  12. </head>
  13. <body>
  14. <%--
  15. 四个域:
  16. page
  17. 范围:当前页面
  18. 对应的域对象:pageContext
  19. request
  20. 范围:当前请求(一次请求)
  21. 对应的域对象:request
  22. session
  23. 范围:当前会话(一次会话)
  24. 对应的域对象:session
  25. application
  26. 范围:当前Web应用
  27. 对应的域对象:application
  28. 四个域对象都有以下三个方法:
  29. void setAttribute(String key , Object value);
  30. Object getAttribute(String key);
  31. void removeAttribute(String key);
  32. 四个域的使用规则:
  33. 能用小的就不用大的
  34. Servletjsp页面的分工:
  35. Servlet用来处理请求;jsp用来显示数据
  36. --%>
  37. <%--在当前页面分别向四个域中添加四个属性--%>
  38. <%
  39. pageContext.setAttribute("pageKey","pageValue");
  40. request.setAttribute("reqKey","reqValue");
  41. session.setAttribute("sessKey","sessValue");
  42. application.setAttribute("appKey","appValue");
  43. %>
  44. <h1>在当前页面中获取四个域中的属性值</h1>
  45. page域中的属性值是:<%=pageContext.getAttribute("pageKey")%><br>
  46. request域中的属性值是:<%=request.getAttribute("reqKey")%><br>
  47. session域中的属性值是:<%=session.getAttribute("sessKey")%><br>
  48. application域中的属性值是:<%=application.getAttribute("appKey")%><br>
  49. <%--转发到scope2.jsp页面--%>
  50. <%-- <jsp:forward page="/obj/scope2.jsp"></jsp:forward>--%>
  51. <%--通过点击超链接跳转到scope2.jsp页面--%>
  52. <a href="/Web_JSP/obj/scope2.jsp">去scope2.jsp页面</a>
  53. </body>
  54. </html>