Servlet

Servlet

Servlet简介

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

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

    • 编写一个类,实现servlet接口
    • 把开发好的Java类部署到web服务器

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

HelloServlet

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

  1. 构建一个普通Maven项目,删掉其中原有的src文件夹,通过moudel构建以后的学习所用的项目;这个空的工程就是以后的主工程

  2. 关于Maven父子工程的理解

    父项目中会有

    <modules>
        <module>servlet</module>
    </modules>

​ 父项目中的jar包子项目可以使用,反过来父项目不能使用子项目的jar包

  1. 将web.xml中的版本换成最新的

  2. 完善项目结构

    • java
    • resources
  3. 编写一个Servlet程序

    1. 编写一个普通类
    2. 实现Servlet接口,继承HttpServlet
    public class HelloServlet extends HttpServlet{
        // 由于get和post只是请求是实现的不同实现方式,可以互相调用,业务逻辑一样
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            PrintWriter writer = resp.getWriter(); // 响应流
            writer.print("hello,servlet");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
           doGet(req, resp);
        }
    }
    
    
    1. 为什么需要映射:我们写的是Java程序,但是需要通过浏览器进行访问,而浏览器需要连接web服务器,所以我们需要在web服务器中注册我们写的Servlet,还需要给他一个浏览器可以访问的地址
        <!--注册Servlet-->
        <servlet>
            <servlet-name>hello</servlet-name>
            <servlet-class>com.cnpolairs.HelloServlet</servlet-class>
        </servlet>
        <!--Servlet的请求路径-->
        <servlet-mapping>
            <servlet-name>hello</servlet-name>
            <url-pattern>/hello</url-pattern>
        </servlet-mapping>

  1. 配置tomcat

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

    1. 启动测试

Servlet原理

Servlet是由web服务器调用,web服务器在收到浏览器请求之后,会

Mapping问题

  1. 一个Servlet可以指定一个映射路径
<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>
  1. 一个Servlet可以指定多个映射路径
 <servlet-mapping>
     <servlet-name>hello</servlet-name>
     <url-pattern>/hello</url-pattern>
</servlet-mapping> <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello2</url-pattern>
</servlet-mapping>
  1. 一个Servlet可以指定通用映射路径
<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello/*</url-pattern>
</servlet-mapping>
  1. 默认请求路径
<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>
  1. 指定一些后缀或者前缀等
<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>*.cnpolaris</url-pattern>
</servlet-mapping>
  1. 优先级问题

    指定了固有的映射路径优先级最高,如果找不到就会走默认的请求路径

    <!--404-->
    <servlet>
        <servlet-name>error</servlet-name>
        <servlet-class>com.cnpolairs.ErrorServlet</servlet-class>
    </servlet>
    <!--Servlet的请求路径-->
    <servlet-mapping>
        <servlet-name>error</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
    
    

ServletContext

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

共享数据

在一个Servlet中的数据,可以在另一个Servlet中访问

存数据

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        this.getInitParameter() // 初始化参数
//        this.getServletConfig() // Servlet配置
//        this.getServletContext() // Servlet上下文
        ServletContext context = this.getServletContext();

        String username = "CNPolaris";
        context.setAttribute("username",username); //将一个数据保存在ServletContext中,名字为username 值为username
        System.out.println("hello,servlet");
    }
}

取数据

public class GetServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 测试取出servlet中的数据
        ServletContext context = this.getServletContext();
        String username = String.valueOf(context.getAttribute("username"));

        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        PrintWriter writer = resp.getWriter();
        writer.println(username);
    }
}

配置

  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.cnpolaris.servlet.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>getname</servlet-name>
    <servlet-class>com.cnpolaris.servlet.GetServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>getname</servlet-name>
    <url-pattern>/getname</url-pattern>
  </servlet-mapping>

测试访问

获取初始化参数

<!--配置一些初始化参数-->
  <context-param>
    <param-name>URL</param-name>
    <param-value>jdbc:mysql://localhost:3306</param-value>
  </context-param>
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String url = context.getInitParameter("URL");
        resp.getWriter().print(url);
    }

请求转发

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        System.out.println("进入了demo04");
//        RequestDispatcher requestDispatcher = context.getRequestDispatcher("/get"); //转发的请求路径
//        requestDispatcher.forward(req,resp); //调用forward实现请求转发
        context.getRequestDispatcher("/get").forward(req,resp);
    }

读取资源文件

Properties

  • 在Java目录下新建Properties
  • 在resources目录下新建Properties

发现:都被打包到一个同一路径下:classes 俗称这个路径为classpath

思路:需要一个文件流

username=root
password=123
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        InputStream resourceAsStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");

        Properties properties = new Properties();
        properties.load(resourceAsStream);
        String username = properties.getProperty("username");
        String password = properties.getProperty("password");
        resp.getWriter().print(username+":"+password);
    }
posted @ 2020-11-14 11:46  CNPolaris  阅读(57)  评论(0编辑  收藏  举报