• 毕设准备---HelloServlet


    HelloServlet

    接着昨天创建的maven  webapp项目继续玩,先体验体验。

    模仿服务器中的例子

    1. package com.wyh.servlet;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.http.HttpServlet;
    4. import javax.servlet.http.HttpServletRequest;
    5. import javax.servlet.http.HttpServletResponse;
    6. import java.io.IOException;
    7. import java.io.PrintWriter;
    8. /**
    9. * @author WuYongheng
    10. * @date 2022/8/26
    11. * @description
    12. */
    13. public class HelloServlet extends HttpServlet {
    14. @Override
    15. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    16. //响应的类型:html
    17. resp.setContentType("text/html");
    18. resp.setCharacterEncoding("UTF-8");
    19. //获取响应的输出流
    20. PrintWriter out = resp.getWriter();
    21. out.println("");
    22. out.println("");
    23. out.println("Hello Servlet!");
    24. out.println("");
    25. out.println("");
    26. out.println("

      Hello Servlet!

      "
      );
    27. out.println("

      你好 Servlet!

      "
      );
    28. out.println("");
    29. out.println("");
    30. }
    31. @Override
    32. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    33. }
    34. }

    可能会遇到的问题

    1、这里HttpServlet刚开始会标红,提示导包,alt+enter选择add搜索看看本地库里有没有servlet包?

    • 有,就直接用
    • 没有,就去网上找jar包,我这就介绍的方法是,在pom.xml中添加依赖代码,自动下载包
    1. <dependency>
    2. <groupId>javax.servletgroupId>
    3. <artifactId>javax.servlet-apiartifactId>
    4. <version>4.0.1version>
    5. <scope>providedscope>
    6. dependency>

    2、 为了显示出中文,需要在doGet请求中配置编码:UTF-8,因为在ISO 8859-1编码中,中文是乱码。

    resp.setCharacterEncoding("UTF-8");

    web.xml 配置servlet映射

    启动服务器,输入配置的url-pattern访问


    什么是Servlet?

    servlet是sun公司开发动态web的一门技术

    Sun在这些API中提供一个接口叫做:Servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤:

    1. 编写一个类,实现Servlet接口
    2. 把开发好的Java类部署到web服务器中。

    把实现了Servlet接口的Java程序叫做:Servlet

    Servlet接口Sun公司有两个默认的实现类:HttpServlet   GenericServlet

    Servlet创建步骤

    1、删除src目录

    创建一普通的Maven项目,删除src目录,这样就可以基于这个普通的Maven建Model,这个空工程就是Maven的主工程,在主工程中导入依赖,之后在新建的Model中不用重复导入。

    2、在pom.xml中配置

    1. <dependency>
    2. <groupId>javax.servletgroupId>
    3. <artifactId>javax.servlet-apiartifactId>
    4. <version>4.0.1version>
    5. <scope>providedscope>
    6. dependency>

    3、Maven环境优化

    1. 把web.xml修改为最新,去tomcat中复制。
    2. 将maven的结构搭建完整,在main目录下添加java和resources,并标记。

    4、编写一个Servlet程序

    1. 编写一个普通类
    2. 实现Servlet接口,这里直接继承HttpSer
    1. package com.wyh.servlet;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.http.HttpServlet;
    4. import javax.servlet.http.HttpServletRequest;
    5. import javax.servlet.http.HttpServletResponse;
    6. import java.io.IOException;
    7. import java.io.PrintWriter;
    8. /**
    9. * @author WuYongheng
    10. * @date 2022/8/26
    11. * @description
    12. */
    13. public class HelloServlet extends HttpServlet {
    14. @Override
    15. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    16. PrintWriter writer = resp.getWriter(); // 响应流
    17. writer.println("Hello Servlet!");
    18. }
    19. @Override
    20. protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    21. doGet(req, resp);
    22. }
    23. }

    5、编写Servlet映射

    1. <servlet>
    2. <servlet-name>helloservlet-name>
    3. <servlet-class>com.wyh.servlet.HelloServletservlet-class>
    4. servlet>
    5. <servlet-mapping>
    6. <servlet-name>helloservlet-name>
    7. <url-pattern>/wyhurl-pattern>
    8. servlet-mapping>

    为什么需要映射?

    我们写的是Java程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务器中注册我们写的Servlet,还需要给他一个浏览器能够访问的路径。

    6、配置Tomcat

    注意:配置项目发布的路径

    7、启动服务器验证

    观察url


    关于父子工程的理解

    父项目中的jar包,子项目可以直接使用,和Java中的继承差不多。创建父子工程,简化操作了

    Servlet原理

    Mapping问题

    1、一个Servlet可以指定一个路径

    2、一个Servlet可以指定多个路径

    3、一个Servlet可以指定通用路径,这样会干掉index.jsp,不建议使用

    1. <servlet-mapping>
    2. <servlet-name>helloservlet-name>
    3. <url-pattern>/*url-pattern>
    4. servlet-mapping>

    4、一个Servlet可以自定义后缀实现请求映射,注意,*前面不能剧啊项目的映射路径

    1. <servlet-mapping>
    2. <servlet-name>helloservlet-name>
    3. <url-pattern>*.wyhurl-pattern>
    4. servlet-mapping>

    5、优先级问题

    • 指定了固有的映射路径优先级最高,如果找不到,才会走默认的处理请求。
    • 可以利用优先级,处理error,自定义404。。。

    Servlet-Context

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

    共享数据

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

    放置数据的代码:

    1. package com.wyh.servlet;
    2. import javax.servlet.ServletContext;
    3. import javax.servlet.ServletException;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. /**
    9. * @author WuYongheng
    10. * @date 2022/8/29
    11. * @description
    12. */
    13. public class HelloServlet extends HttpServlet {
    14. @Override
    15. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    16. ServletContext context = this.getServletContext();
    17. String username = "巫永恒";
    18. // 将数据保存在了Servlet中,名字为:username。值 username
    19. context.setAttribute("username", username);
    20. }
    21. @Override
    22. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    23. doGet(req, resp);
    24. }
    25. }

    接收数据的代码:

    1. package com.wyh.servlet;
    2. import javax.servlet.ServletContext;
    3. import javax.servlet.ServletException;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. /**
    9. * @author WuYongheng
    10. * @date 2022/8/29
    11. * @description
    12. */
    13. public class GetContext extends HttpServlet {
    14. @Override
    15. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    16. ServletContext context=this.getServletContext();
    17. String username= (String) context.getAttribute("username");
    18. resp.setContentType("text/html");
    19. resp.setCharacterEncoding("utf-8");
    20. resp.getWriter().print("名字"+username);
    21. }
    22. @Override
    23. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    24. doGet(req, resp);
    25. }
    26. }

    xml配置映射:

    1. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
    4. http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    5. version="4.0"
    6. metadata-complete="true">
    7. <servlet>
    8. <servlet-name>helloservlet-name>
    9. <servlet-class>com.wyh.servlet.HelloServletservlet-class>
    10. servlet>
    11. <servlet-mapping>
    12. <servlet-name>helloservlet-name>
    13. <url-pattern>/wyhurl-pattern>
    14. servlet-mapping>
    15. <servlet>
    16. <servlet-name>getcservlet-name>
    17. <servlet-class>com.wyh.servlet.GetContextservlet-class>
    18. servlet>
    19. <servlet-mapping>
    20. <servlet-name>getcservlet-name>
    21. <url-pattern>/getcurl-pattern>
    22. servlet-mapping>
    23. web-app>

    访问效果:

    直接访问/getc,拿不到名字。

    先访问/wyh,将数据放到ServletContext里面,再访问/getc拿到数据

  • 相关阅读:
    【JavaScript复习十】数组入门知识
    靠这份业界最强算法及数据结构宝典,我挺进字节跳动
    Backblaze2022中期SSD故障质量报告解读
    94-Java的转换流:解决代码与文件编码不一致读取乱码的问题
    ICMP Redirect Attack Lab(SEED实验)
    Unity 使用Sqlite
    Java新手小白入门篇 API - IO流
    深度学习常用激活函数总结
    基于JavaSwing开发学生成绩管理系统(SQLServer数据库) 课程设计 大作业
    文化主题公园旅游景点3d全景VR交互体验加深了他们对历史文化的认知和印象
  • 原文地址:https://blog.csdn.net/Ipkiss_Yongheng/article/details/126544468