Servlet技术(上)

本文深入解析Servlet技术,涵盖Servlet的基本概念、映射机制、ServletContext的使用及请求转发与重定向的区别。通过实例演示如何利用Servlet处理HTTP请求,共享数据及读取资源文件。

目录

前言

什么是Servlet

Mapping映射问题

ServletContext

什么是ServletContext

ServletContext的常用功能

面试题——聊聊请求转发和重定向 

 

 

前言

 

本节我们介绍Servlet。围绕着Servlet这门技术,剖析它的组成ServletContext对象,HttpServletResponse,HttpServletRequest。

 

 

什么是Servlet

 

Servlet是sun公司开发动态web的一门技术。使用Servlet开发动态web也很简单,只需要让编写的类继承Servlet接口,然后把开发好的Java类部署到web服务器上即可。我们来看一下Servlet接口的继承关系图。

 

 

Mapping映射问题

 

为什么要编写Servlet的映射。因为Java程序要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务中注册我们写的Servlet,提供一个浏览器的访问路径。

 

一个Servlet可以映射一个或多个路径,也可以使用通配符指定任意路径(通配符前面不能加/)。关于映射路径的优先级,指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求。

<!--404-->
<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello/*</url-pattern>
</servlet-mapping>
<servlet>
    <servlet-name>error</servlet-name>
    <servlet-class>com.kuang.servlet.ErrorServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>error</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

 

 

ServletContext

 

什么是ServletContext

web容器在启动的时候,不同的Servlet之间通过ServletContext通信。发送方向ServletContext里面提交数据,接受方从ServletContext里面拿取数据。

 

ServletContext的常用功能

1.共享数据

在这个Servlet中保存的数据,可以在另一个servlet中拿到。需要注意设置context类型和编码集类型

public class GetServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String username = (String) context.getAttribute("username");

        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        resp.getWriter().print("名字"+username);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

2.获取web配置的初始化参数

    <!--在web.xml文件中配置一些web应用初始化参数-->
    <context-param>
        <param-name>url</param-name>
        <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
    </context-param>
//在servlet中获取getInitParameter
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    ServletContext context = this.getServletContext();
    String url = context.getInitParameter("url");
    resp.getWriter().print(url);
}

3.请求转发

输入a的路径,转发到了b的页面,获取的是b页面的内容,这叫做请求转发。

输入a的路径,由于做了重定向的配置,跳转的是b的页面,并显示的是b的页面路径。

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

4.读取资源文件

无论是在java目录还是在resources目录下的配置文件都会打包到taget中的classes路径下俗称classpath,我们通过文件流来获取路径,通过Properties类对象来获取配置文件信息。

public class ServletDemo05 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/com/kuang/servlet/aa.properties");

        Properties prop = new Properties();
        prop.load(is);
        String user = prop.getProperty("username");
        String pwd = prop.getProperty("password");

        resp.getWriter().print(user+":"+pwd);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

 

 

面试题——聊聊请求转发和重定向 

 

相同点:页面都会实现跳转

不同点:请求转发时url不会变化,响应码是307;重定向时url会发生变化,响应码是302 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值