Servlet

ServletContext

每个web工程都只有一个ServletContext对象,也就是不管在哪个Servlet里面,获取到的这个类的对象都是同一个,它用来获取Servlet的上下文,在服务器启动的时候,会为托管的每一个web应用程序,创建一个ServletContext对象,当从服务器移除托管或者是关闭服务器时,ServletContext将会被销毁。它主要有以下几方面作用:
  1. 获取全局配置参数
  2. 获取web工程中的资源
  3. 在servlet间共享数据域对象

获取全局配置参数

在web.xml中新增一下以下代码

<context-param>
    <param-name>username</param-name>
    <param-value>zed</param-value>
</context-param>
<context-param>
    <param-name>password</param-name>
    <param-value>123456</param-value>
</context-param>

在MyHttpServlet的doGet方法中新增以下代码

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("doGet method invoke...");

    //获取全部初始化名称和其对应的内容
    Enumeration<String> initParameterNames = getServletContext().getInitParameterNames();
    while (initParameterNames.hasMoreElements()){
        String InitParameterName = initParameterNames.nextElement();
        String initParameter = getServletContext().getInitParameter(InitParameterName);
        System.out.println(initParameter);
    }
}

重启Tomcat服务器,在浏览器中访问

image-20210525220552671

获取web工程中的资源

在webapp文件夹中创建a.txt文件,内容为hello world

image-20210525220815234

在MyHttpServlet的doGet方法中新增以下代码

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("doGet method invoke...");

    //获取全部初始化名称和其对应的内容
    Enumeration<String> initParameterNames = getServletContext().getInitParameterNames();
    while (initParameterNames.hasMoreElements()){
        String InitParameterName = initParameterNames.nextElement();
        String initParameter = getServletContext().getInitParameter(InitParameterName);
        System.out.println(initParameter);
    }

    //获取web工程中的资源的绝对路径
    String realPath = getServletContext().getRealPath("a.txt");
    System.out.println(realPath);

    //获取web工程中的资源的输入流对象
    InputStream resourceAsStream = getServletContext().getResourceAsStream("a.txt");
    System.out.println(resourceAsStream);

    }

重启Tomcat服务器,在浏览器中访问

image-20210525221533808

在Servlet间访问共享数据域对象

创建LoginServlet并配置请求映射

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

    }
}
<servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>com.ccl.servlet.demo.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/ls</url-pattern>
</servlet-mapping>

在LoginServlet的doGet中是实现登录次数的修改,默认为1

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //获取当前登录次数
    Integer count = (Integer) getServletContext().getAttribute("count");

    //如果当前登录为null,则设置默认值为1
    if (count == null){
        getServletContext().setAttribute("count",1);
    }else {
        getServletContext().setAttribute("count",count+1);
    }
}

在MyHttpServlet的doGet中新增以下查看代码,用于查看当前登录次数

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("doGet method invoke...");

    //获取全部初始化名称和其对应的内容
    Enumeration<String> initParameterNames = getServletContext().getInitParameterNames();
    while (initParameterNames.hasMoreElements()){
        String InitParameterName = initParameterNames.nextElement();
        String initParameter = getServletContext().getInitParameter(InitParameterName);
        System.out.println(initParameter);
    }

    //获取web工程中的资源的绝对路径
    String realPath = getServletContext().getRealPath("a.txt");
    System.out.println(realPath);

    //获取web工程中的资源的输入流对象
    InputStream resourceAsStream = getServletContext().getResourceAsStream("a.txt");
    System.out.println(resourceAsStream);

    //查看当前网站登录次数,这个数据是保存ServletContext中的
    Integer count = (Integer) getServletContext().getAttribute("count");
    //判断是否登录过,如果没有登录过,提示未登录过,如果已登录过,显示登录次数
    if (count == null){
        resp.getWriter().write("no login");
    }else {
        resp.getWriter().write("count:" + count);
    }
}

重启Tomcat服务器

访问呢MyHttpServlet页面,查看是否登录

image-20210525223143020

访问LoginServlet页面,模拟登录场景

image-20210525223327069

访问呢MyHttpServlet页面,查看是否登录

image-20210525223352472

ServletConfig

通过ServletConfig对象可以获取Servlet在配置的时候的一些信息

创建类HelloServlet

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

在web.xml中配置映射关系

<servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>com.ccl.servlet.demo.HelloServlet</servlet-class>
    <!--        Servlet的初始化参数-->
    <init-param>
        <param-name>driver</param-name>
        <param-value>com.mysql.jdbc.Driver</param-value>
    </init-param>
    <init-param>
        <param-name>url</param-name>
        <param-value>jdbc:mysql://localhost:3306/test</param-value>
    </init-param>
    <init-param>
        <param-name>username</param-name>
        <param-value>root</param-value>
    </init-param>
    <init-param>
        <param-name>password</param-name>
        <param-value>123456</param-value>
    </init-param>
    <!--        Servlet的加载顺序-->
    <load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/hs</url-pattern>
</servlet-mapping>

在HelloServlet的doGet方法中新增以下代码

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    Enumeration<String> initParameterNames = getServletConfig().getInitParameterNames();
    while (initParameterNames.hasMoreElements()){
        String initParameterName = initParameterNames.nextElement();
        String initParameterValue = getServletConfig().getInitParameter(initParameterName);
        System.out.println(initParameterName + ":" + initParameterValue);
    }
}

重启Tomcat服务器,在浏览器中访问

image-20210525225747161

HttpServletRequest

HttpServletRequest这个对象封装了客户端提交过来的一切数据

修改index.jsp

<form action="rs" method="get">
    账号:<input type="text" name="username"><br>
    密码:<input type="text" name="password"><br>
    <input type="submit" value="注册">
</form>

创建类RegisterServlet

public class RegisterServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取客户端传递过来的头部信息
        Enumeration<String> headerNames = req.getHeaderNames();
        while (headerNames.hasMoreElements()){
            String headerName = headerNames.nextElement();
            String headerValue = resp.getHeader(headerName);
            System.out.println(headerName + ":" + headerValue);
        }
        System.out.println("=============");

        //获取客户端传递过来的参数信息
        Enumeration<String> parameterNames = req.getParameterNames();
        while (parameterNames.hasMoreElements()){
            String parameterName = parameterNames.nextElement();
            String parameterValue = req.getParameter(parameterName);
            System.out.println(parameterName + ":" + parameterValue);
        }
        System.out.println("=============");

        //以map集合的形式获取客户端传递过来的参数信息
        Map<String, String[]> parameterMap = req.getParameterMap();
        Set<String> names = parameterMap.keySet();
        for (String name : names){
            String[] value = parameterMap.get(name);
            System.out.println(name + ":" + Arrays.toString(value));
        }
        System.out.println("=============");

        //获取一些其他地址,查询等信息
        StringBuffer requestURL = req.getRequestURL();
        String requestURI = req.getRequestURI();
        String servletPath = req.getServletPath();
        String queryString = req.getQueryString();
        System.out.println("requestURL:" + requestURL);
        System.out.println("requestURI:" + requestURI);
        System.out.println("servletPath:" + servletPath);
        System.out.println("queryString:" + queryString);
    }
}

在web.xml中新增映射信息

<servlet>
    <servlet-name>RegisterServlet</servlet-name>
    <servlet-class>com.ccl.servlet.demo.RegisterServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>RegisterServlet</servlet-name>
    <url-pattern>/rs</url-pattern>
</servlet-mapping>

重启Tomcat服务器,访问页面并输入数据提交

image-20210525232634020

IDEA控制器信息

host:null
connection:null
sec-ch-ua:null
sec-ch-ua-mobile:null
upgrade-insecure-requests:null
user-agent:null
accept:null
sec-fetch-site:null
sec-fetch-mode:null
sec-fetch-user:null
sec-fetch-dest:null
referer:null
accept-encoding:null
accept-language:null
cookie:null
=============
username:asd
password:123
=============
username:[asd]
password:[123]
=============
requestURL:http://localhost:8080/sr/rs
requestURI:/sr/rs
servletPath:/rs
queryString:username=asd&password=123

解决请求数据中文乱码问题

GET方式

// 先用原来的编码解码再用UTF—8重新编码。
String newUsername = new String(username.getBytes("ISO-8859-1"), "UTF-8");

POST方式

// 这行设置一定要写在getParameter之前。
request.setCharacterEncoding("UTF-8");

HttpServletResponse

HttpServletResponse这个对象负责返回数据给客户端

创建类DisplayServlet

public class DisplayServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /**
         * 以下两种方式只能用一种
         */
        //字符流
        resp.getWriter().write("<h1>hello response 111...</h1>");

        //字节流
        //resp.getOutputStream().write("hello response 222...".getBytes());
    }
}

在web.xml文件中新增以下映射信息

<servlet>
    <servlet-name>DisplayServlet</servlet-name>
    <servlet-class>com.ccl.servlet.demo.DisplayServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>DisplayServlet</servlet-name>
    <url-pattern>/ds</url-pattern>
</servlet-mapping>

重启Tomcat服务器,在浏览器中访问

image-20210525234050689

解决响应数据中文乱码问题

以字符流输出:response.getWriter()

response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Type", "text/html; charset=UTF-8");
response.getWriter().write("你好,世界!");

以字节流输出:response.getOutputStream()

response.setHeader("Content-Type", "text/html;charset=UTF-8");
response.getOutputStream().write("你好,世界!".getBytes("UTF-8"));

重定向和请求转发

重定向

	// 第一种:使用示例
	response.setStatus(302);
	response.setHeader("Location", "login_success.html");*/
		
	// 第二种:使用示例
	response.sendRedirect("login_success.html");

	1. 地址上显示的是最后的那个资源的路径地址。

	2. 请求次数最少有两次,服务器在第一次请求后,会返回302以及一个地址,浏览器在根据这个地址,执行第二次访问。

	3. 可以跳转到任意路径,不是自己的工程也可以跳。

	4. 效率稍微低一点,执行两次请求。 

	5. 后续的请求,没法使用上一次的request存储的数据,或者没法使用上一次的request对象,因为这是两次不同的请求。

请求转发

	// 使用示例:
	request.getRequestDispatcher("login_success.html").forward(request, response);

	1. 地址上显示的是请求servlet的地址,返回200ok。

	2. 请求次数只有一次,因为是服务器内部帮客户端执行了后续的工作。 

	3. 只能跳转自己项目的资源路径。  

	4. 效率上稍微高一点,因为只执行一次请求。 

	5. 可以使用上一次的request对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值