Servlet接口Servlet程序

    ⭕Servlet是什么?

    • 把实现了servlet接口的java程序叫做Servlet
    • Servlet是sun公司开发动态web的一门技术
    • Sun子这些API中提供了一个接口叫做:Servlet,如果你想开发一个Servlet程序,只需要完成两个步骤
      a. 编写一个类,实现Servlet接口 b.把开发好的java类部署到web服务器中

    ⭕HelloServlet

    Servlet接口有两个默认的实现类:HttpServlet

    • 关于Maven父子工程
    1. //当建立子项目时父项目中会添加
    2. <modules>
    3. <module>ServletDemoSon01</module>
    4. </modules>
    1. //子项目会有
    2. <parent>
    3. <artifactId>ServletDemo1.0</artifactId>
    4. <groupId>com.Jack</groupId>
    5. <version>1.0-SNAPSHOT</version>
    6. </parent>
    • Maen环境优化
    1. 修改web.xml文件为最新(模板就在tomcat的实例目录中)
    2. 将maven的结构补充完整(java文件夹和resource文件夹)
    • 编写一个Servlet
    1. public class HelloServlet extends HttpServlet {
    2. //由于get或者post只是请求实现的不同的方式,可以相互调用,业务逻辑都一样
    3. @Override
    4. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    5. PrintWriter writer = resp.getWriter();//响应流
    6. writer.print("Hello,Serlvet");
    7. }
    8. @Override
    9. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    10. super.doPost(req, resp);
    11. }
    12. }
    • 编写Servlet的映射(为什么需要映射?)

    因为我们写的是Java程序,但是要通过浏览器访问

    而浏览器需要连接web服务器

    所以我们需要在web服务中注册我们写的Servlet,还需要给他一个浏览器能够访问的路径:

    1. <!-- 注册Servlet -->
    2. <servlet>
    3. <servlet-name>Hello</servlet-name>
    4. <servlet-class>com.jack.servlet.HelloServlet</servlet-class>
    5. </servlet>
    6. <!-- Servlet的请求路径 -->
    7. <servlet-mapping>
    8. <servlet-name>Hello</servlet-name>
    9. <url-pattern>/Hello</url-pattern>
    10. </servlet-mapping>
    • 配置Tomcat
    • 启动测试

    Servlet原理

    Mapping问题

    1. ⌨一个Servlet可以指定一个及以上的映射路径
    2. <servlet-mapping>
    3. <servlet-name>Hello</servlet-name>
    4. <url-pattern>/Hello</url-pattern>
    5. </servlet-mapping>
    6. <servlet-mapping>
    7. <servlet-name>Hello</servlet-name>
    8. <url-pattern>/Hello2</url-pattern>
    9. </servlet-mapping>
    10. <servlet-mapping>
    11. <servlet-name>Hello</servlet-name>
    12. <url-pattern>/Hello3</url-pattern>
    13. </servlet-mapping>
    1. ⌨一个Servlet可以指定通用路径(什么意思?)
    2. <servlet-mapping>
    3. <servlet-name>Hello</servlet-name>
    4. <url-pattern>/Hello/*</url-pattern>
    5. </servlet-mapping>
    1. ⌨可以自定义后缀实现请求映射
    2. <servlet-mapping>
    3. <servlet-name>Hello</servlet-name>
    4. <url-pattern>*.Jack</url-pattern>
    5. </servlet-mapping>

    ⭕ServletContext

    • ServletContext是什么
      web容器在启动的时候,他会为每一个web程序创建一个ServletContext对象,它代表了当前的web应用
    • ServletContext可以干什么
      a. 共享数据 b. 获取web初始参数 c. 请求转发 d.读取资源文件
    • 共享数据
    1. ⌨这个是放置类,可以传递数据,在这个Servlet中保存数据,可以在另外一个Servlet中拿到
    2. public class HelloServlet extends HttpServlet {
    3. @Override
    4. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    5. ServletContext servletContext = this.getServletContext();
    6. String name="Jack";
    7. servletContext.setAttribute("name",name);//将一个数据保存在ServletContext中,key为name,value为name
    8. System.out.println("Hello");
    9. }
    10. }
    1. ⌨接收读取数据
    2. public class GetServlet extends HttpServlet {
    3. @Override
    4. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    5. ServletContext servletContext = this.getServletContext();
    6. Object getname = (String)servletContext.getAttribute("name");
    7. resp.setContentType("text/html");
    8. resp.setCharacterEncoding("utf-8");
    9. resp.getWriter().print("你好!"+getname);
    10. }
    11. @Override
    12. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    13. }
    14. }
    1. ⌨完善web.xml文件
    2. <servlet>
    3. <servlet-name>Hello02</servlet-name>
    4. <servlet-class>com.jack.servlet.HelloServlet</servlet-class>
    5. </servlet>
    6. <servlet-mapping>
    7. <servlet-name>Hello02</servlet-name>
    8. <url-pattern>/hello02</url-pattern>
    9. </servlet-mapping>
    10. <servlet>
    11. <servlet-name>get</servlet-name>
    12. <servlet-class>com.jack.servlet.GetServlet</servlet-class>
    13. </servlet>
    14. <servlet-mapping>
    15. <servlet-name>get</servlet-name>
    16. <url-pattern>/get</url-pattern>
    17. </servlet-mapping>
    • 获取web初始参数
    1. ⌨配置一些web应用初始化参数
    2. <context-param>
    3. <param-name>url</param-name>
    4. <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
    5. </context-param>
    1. servlet
    2. @Override
    3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. ServletContext servletContext = this.getServletContext();
    5. String url = servletContext.getInitParameter("url");
    6. resp.getWriter().print(url);
    7. }
    • 请求转发
    1. servlet
    2. @Override
    3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. ServletContext servletContext = this.getServletContext();
    5. System.out.println("进入了ForwardDemo");
    6. //转发的请求路径
    7. RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("/sd");
    8. //调用forward方法实现请求转发
    9. requestDispatcher.forward(req,resp);
    10. //也可以这样
    11. //servletContext.getRequestDispatcher("/sd").forward(req,resp);
    12. }

    🎪Java针对Web开发做了什么? - 图1

    • 读取资源文件
    1. Properties
    2. //- 再Java目录下新建properties
    3. //- 在resources目录下新建properties
    4. //发现:都被打包到了同一路径下:classes,我们俗称这个路径为classpath:
    5. @Override
    6. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    7. InputStream resourceAsStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
    8. Properties properties = new Properties();
    9. properties.load(resourceAsStream);
    10. String username = properties.getProperty("username");
    11. String password = properties.getProperty("password");
    12. resp.getWriter().print(username+";"+password);
    13. }

    ⭕HttpServletResponse & HttpServletRequest

    • web服务器接收客户端http请求,针对这个请求分别创建:
      代表响应的HttpServletResponse—-给客户端发送响应的信息
      代表请求的HttpServletRequest—-用来获取客户端请求过来的参数
    • 服务端如何接收请求的?
      客户端/浏览器通过HTTP协议访问并向服务器发出请求 , 所有的请求都会被封装进HttpServletRequest中,通过HttpServletRequest的方法,获得客户端的所有信息
    • HttpServletResponse方法简单分类
    1. ⌨负责向浏览器发送数据的方法
    2. ServletOutputStream getOutputStream() throws IOException;
    3. PrintWriter getWriter() throws IOException;
    1. ⌨负责向浏览器发送响应头的方法
    2. void setCharacterEncoding(String var1);
    3. void setContentLength(int var1);
    4. void setContentLengthLong(long var1);
    5. void setContentType(String var1);
    6. void setBufferSize(int var1);
    7. void sendError(int var1, String var2) throws IOException;
    8. void sendError(int var1) throws IOException;
    9. void sendRedirect(String var1) throws IOException;
    10. void setDateHeader(String var1, long var2);
    11. void addDateHeader(String var1, long var2);
    12. void setHeader(String var1, String var2);
    13. void addHeader(String var1, String var2);
    14. void setIntHeader(String var1, int var2);
    15. void addIntHeader(String var1, int var2);
    16. void setStatus(int var1);
    • 常见应用
      a.向浏览器输出信息 b.下载文件 c.验证码 d.实现重定向

    小结🚩

    ※※※※※五星级重要