JavaWeb——Servlet(上)

1、介绍

  1. 什么是servlet
    servlet是javaEE规范之一,规范就是接口
  2. servlet就是javaweb三大组件之一
    三大组件分别是:Servlet程序,Filter过滤器,listener监听器
  3. Servlet是运行在服务器上的一个java小程序,它可以接收客户端发过来的请求,并响应数据给客户端

2、Servlet的使用

2.1、手动实现Servlet程序

  1. 编写一个类去实现Servlet接口
  2. 实现service方法处理请求,并响应数据
  3. 到web.xml中去配置servlet程序的访问地址
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
<!--    servlet标签给tomcat配置servlet程序-->
    <servlet>
<!--        servlet-name标签给servlet程序起一个别名一般是类名-->
        <servlet-name>servletTest</servlet-name>
<!--        servlet-class是servlet程序的全类名-->
        <servlet-class>servlet.servletTest</servlet-class>
    </servlet>

<!--    servlet-mapping给servlet程序配置访问地址-->
    <servlet-mapping>
<!--        servlet-name的作用是告诉服务器,我当前配置的地址给哪个servlet程序使用-->
        <servlet-name>servletTest</servlet-name>
<!--        url-pattern标签配置访问地址
            /test解析
            /表示在服务器解析的时候,表示地址为http://ip:port/工程路径
            test表示地址为http://ip:port/工程路径/test
-->
        <url-pattern>/test</url-pattern>
    </servlet-mapping>
</web-app>

url-pattern如何定位到Servlet程序访问
在这里插入图片描述

2.2、Servlet的生命周期

  1. 执行Servlet构造器方法,只执行一次
  2. 执行init初始化方法,只执行一次
  3. 执行service方法,每次访问都被调用
  4. 执行destory方法,停止才会被执行

2.3、Servlet请求的分发处理

请求一般都是从表单中发出的,所以以表单为例,请求类型有get/post两种类型。

<body>
		<form action="http://localhost:8080/javaweb0/test" method="get"></form>
</body>

重写servlet中的service方法获取请求类型。

   /*
    *@description: service方法是专门用来处理请求和响应的
    *@author: dongcedian
    *@date:2021/10/11
    */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        HttpServletRequest httpServletRequest=(HttpServletRequest) servletRequest;
        String method = httpServletRequest.getMethod();
    }

2.4、通过继承HttpServlet实现Servlet程序

一般在实际项目开发中,都是使用继承HttpServlet的方式实现Servlet程序进行开发

  1. 填写一个类去继承HttpServlet类
  2. 根据业务需要重写doGet或doPost方法
  3. 到web.xml中配置Servlet程序的访问地址
public class servletTest0 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);//GET请求的时候调用
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);//POST请求时使用
    }
}
2.4.1、HttpServlet类

在这里插入图片描述

2.4.2、ServletConfig类

sevletConfig类是servlet程序的配置信息类
servlet程序和servletConfig对象是由Tomcat负责创建,我们负责使用
servlet程序默认是第一次访问的时候创建,servletConfig是每个servlet程序创建时,就创建一个对应的
servletConfig对象。

作用

  1. 可以获取Servlet程序的别名servlet-name的值
  2. 获取初始化参数init-param
  3. 获取ServletContext对象
//在重写方法init中
@Override
public class servletTest0 extends HttpServlet {
	public void init(ServletConfig config) throws ServletException {
	    //获取servlet程序别名
	    System.out.println("servletTest0的别名是:"+config.getServletName());
	    //获得初始化参数init-param
	    System.out.println("初始化参数username的值:"+config.getInitParameter("user"));
	    //获得servletContext对象
	    System.out.println("servletContext对象为:"+config.getServletContext());
	}
	//注意,如果还要重写Init方法的话,需要继承父类的init中的config
	public void init(ServletConfig config) throws ServletException {
			super.init(config)
	}
}
<!--在web.xml中书写-->
<servlet>
    <servlet-name>servletTest0</servlet-name>
    <servlet-class>servlet.servletTest0</servlet-class>
    <init-param>
        <param-name>user</param-name>
        <param-value>root</param-value>
    </init-param>
</servlet>
2.4.2、ServletContext类
  1. ServletContext是一个接口,他表示servlet上下文对象
  2. 一个web工程只有一个ServletContext对象实例
  3. ServletContext是一个域对象

什么是域对象:是可以像map一样存取数据的对象,这里的域值得是存取数据的操作范围。
存数据:setAttribute()
取数据:getAttribute()
删除数据:removeAttribute()

作用

  1. 获取web.xml中配置的上下文参数context.param
@Override
//只能放在get中,post无法获取,功能是有区别的。
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //1.获取web.xml中配置上下文参数context.param
    ServletContext context = getServletConfig().getServletContext();
    String username = context.getInitParameter("username");
    System.out.println("context中的username是:"+username);
//        super.doGet(req, resp);//GET请求的时候调用
}
<!--    context上下文是全局性的,是属于整个web的,一定要写在web.xml开始-->
    <context-param>
        <param-name>username</param-name>
        <param-value>dcd</param-value>
    </context-param>
  1. 获取当前的工程路径,格式:/工程路径
//2.获得当前工程路径
System.out.println("当前工程路径:"+context.getContextPath());
  1. 获取工程部署后在服务器硬盘上的绝对路径
//获取工程部署后在硬盘上的绝对路径
System.out.println("工程部署后在硬盘上的绝对路径"+context.getRealPath("/"));

“/” 表示映射到IDEA上的工程 http://ip:port/工程名/ 就是web目录

  1. 像map一样存储数据

web工程开始的时候设置,直到工程销毁的时候才没有的,context是相对于整个工程的文本。

2.4.3、HttpServletRequest类

每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的HTTP协议信息解析好封装到Request对象中,然后传递到service方法(doGet和doPost)中给我们使用,我们可以通过HttpServletRequet对象,获取到所有请求的信息。

常用API

1、getRequestURI() 获取请求的资源路径
2、getRequestURL() 获取请求的统一资源定位符(绝对路径)
3、getRemoteHost() 获取客户端的IP地址
4、getHeader() 获取请求头
5、getParameter() 获取请求的参数
6、getParameterValues() 获取请求的参数(多个值的时候使用)
7、getMethod():获取请求的方式(GET,POST)
8、setAttribute(key,value) 设置域数据
9、getAttribute(key) 获得域数据
10、getRequestDispatcher() 获取请求转发对象

getParameter的使用

在这里插入图片描述

public class servletTest0 extends HttpServlet {
    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println(username+" "+password);
    }
        @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");//解决post提交中文报错问题
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String[] hobbies = req.getParameterValues("hobby");
        System.out.println(username+" "+password+" "+ Arrays.asList(hobbies));
    }
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>这是一个表单</title>
</head>
<body>
    <form action="http://localhost:8080/javaweb0/test0" method="get">
        <table>
            <tr>
                <td>用户名:</td>
                <td><input type="text" name="username"></td>
            </tr>
            <tr>
                <td>密码:</td>
                <td><input type="password" name="password"></td>
            </tr>
            <tr>
                <td>爱好:</td>
                <td>
                    <input type="checkbox" name="hobby" value="cpp">cpp
                    <input type="checkbox" name="hobby" value="java">java
                    <input type="checkbox" name="hobby" value="py">py
                </td>
            </tr>
            <tr>
                <td><input type="submit"></td>
            </tr>
        </table>
    </form>
</body>
</html>

请求的转发

什么是请求的转发?
是指服务器收到请求后,从一个资源,跳到另一个资源的操作叫做请求的转发。

在这里插入图片描述
在这里插入图片描述

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String username = req.getParameter("username");
    System.out.println("在柜台一中查看参数"+username);
    req.setAttribute("key","柜台一的章子");
    RequestDispatcher requestDispatcher = req.getRequestDispatcher("/test");
    requestDispatcher.forward(req,resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String username = req.getParameter("username");
    System.out.println("在柜台2查看参数"+username);
    Object key = req.getAttribute("key");
    System.out.println("柜台1的章子:"+key);
    System.out.println("柜台2处理自己的业务");
}

在这里插入图片描述
在这里插入图片描述
请求转发和jsp的结合使用

需求:用户搜索栏中输入内容,网页查询并在网页中显示查询结果。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.4.4、HttpServletResponse类
  1. 两个输出流

字节流:getOutputStream() 常用于下载(传递二进制数据)
字符流:getWrite() 常用于回传字符串
两个流同时只能使用一个

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    resp.setCharacterEncoding("UTF-8");
    resp.setHeader("Content-Type","text/html;charset=utf-8");
    //另一种方法
    //resp.setContentType("text/html;charset=utf-8");
    PrintWriter writer = resp.getWriter();
    writer.write("收到啦!!");
}

请求重定向

指客户端给服务器发请求,然后服务器告诉客户端给他另一个新地址去访问,因为之前的地址可能已经被废弃。

在这里插入图片描述
在这里插入图片描述

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   resp.setContentType("text/html;charset=utf-8");
   PrintWriter writer = resp.getWriter();
   writer.write("内容已经搬迁了");
   resp.setStatus(302);
   resp.setHeader("location","http://localhost:8080/javaweb0/test");
   //另一种重定向方式
   //resp.sendRedirect("http://localhost:8080/javaweb0/test");
}
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值