Servlet回顾总结

虽然现在的开发中很少会用到servlet和jsp,但是在学习javaweb的时候对其做一个简单的学习和了解,对学习框架时的理解还是有好处的。毕竟框架也是在这些旧的技术的基础上进行封装,从而简化开发步骤。就像Mybatis,底层还是jdbc。

Servlet是什么?

Servlet是运行在服务端web容器里的程序,作用是接受客户端发来的请求,并响应数据给客户端。
在这里插入图片描述
话不多说直接开始吧!

-01-创建第一个Servlet程序

1、使用IDEA创建一个javaweb工程。
创建后你可以在pom.xml中看到已经自动导入如下依赖:

	<dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
    </dependency>

配置tomcat访问路径,在Application context中加上/myservlet(可加可不加)
在这里插入图片描述
配置之后可以看到tomcat的访问url为:
在这里插入图片描述

2、创建一个类实现Servlet接口,需要实现Servlet的5个方法

public class TestServlet01 implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
    	System.out.println("只在启动时执行一次。");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    	System.out.println("每次Servlet被访问都会执行。");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
    	System.out.println("只在关闭时执行一次。");
    }
}

3、在webapp文件夹下的WEB-INF下的web.xml配置Servlet映射
tomcat容器通过该映射找到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>
        <servlet-name>testservlet01</servlet-name><!--Servlet程序起别名-->
        <servlet-class>com.servlet.TestServlet01</servlet-class><!--Servlet程序的全类名-->
    </servlet>
    <servlet-mapping>
        <servlet-name>testservlet01</servlet-name><!--通过别名找到Servlet程序-->
        <url-pattern>/test01</url-pattern><!--在访问路径后加该标签(如:http://localhost:8080/test)-->
    </servlet-mapping>

</web-app>

4、启动tomcat之后,访问:http://localhost:8080/myservlet/test01
可以看到init和service方法中的文字输出在控制台,再次访问链接,service方法中的文字再次打印在控制台,而init方法的文字则没有,因为init方法只在web启动时调用一次,作用是初始化servlet应用。而我们要对客户端发来的请求进行处理的操作就是在service中做的。当关闭tomcat时,destory方法的文字输出在控制台。

-02- Servlet对于post和get请求的处理

servlet接口的service方法并没有辨别不同请求类型的功能,我们可以手动实现一下。

public class TestServlet02 implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        /*将ServletRequest转型为HttpServletRequest
        因为HttpServletRequest有getMethod()方法,可以获得请求的类型*/
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        String method = request.getMethod();
        if (method.equals("POST")){
            System.out.println("POST方式");
        } else if (method.equals("GET")) {
            System.out.println("GET方式");
        }
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
    }
}

记得在web.xml文件中添加相关的servlet-mapping,使用postman工具分别使用get和post请求http://localhost:8080/myservlet/test02
当然,如果每次都需要手动去做判断太麻烦了,HttpServlet类为我们封装了这一操作。

-03- 通过继承HttpServlet实现Servlet

创建一个类继承HttpServlet

public class TestServlet03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Get...");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Post...");
    }
}

我们发现不需要再实现那5个方法,根据需要重写doGet、doPost方法即可,HttpServlet具备对请求类型判断的功能。使用postman工具分别使用get和post请求访问servlet,可以看到对应的内容在控制台中打印出来。

ctrl+左键点开HttpServlet,我们可以看到HttpServlet继承自GenericServlet,而GenericServlet则是实现了Servlet接口。所以以后我们创建Servlet程序时,只需要继承HttpServlet即可。

-04-ServletConfig接口

在t实现Servlet的init方法时,可以看到ServletConfig,通过ServletConfig可以获取当前Servlet程序的相关配置信息。
(1) Servlet程序和ServletConfig对象都是由Tomcat负责创建,编程人员负责使用
(2) Servlet程序默认是第一次访问时创建,每个Servlet程序创建时对应的创建ServletConfig对象, 二者相互对应,
某个Servlet程序只可以获得他对应的ServletConfig对象,无法获得别的 Servlet程序的ServletConfig对象

四个方法:
String getServletName();获取Servlet程序名

ServletContext getServletContext();获取ServletContext对象

String getInitParameter(String var1);获取web.xml中初始化参数的值

Enumeration getInitParameterNames();获取web.xml中所有初始化参数的键

public class TestServlet04 extends HttpServlet {
    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        System.out.println("getServletName:" + config.getServletName());
        System.out.println("getInitParameterNames:" + config.getInitParameterNames());
        Enumeration<String> initParameterNames = config.getInitParameterNames();
        while (initParameterNames.hasMoreElements()){
            System.out.println(initParameterNames.nextElement());
        }
        System.out.println("getInitParameter:" + config.getInitParameter("username"));
        System.out.println("getServletContext:" + config.getServletContext());
    }
}

在web.xml文件中配置当前Servlet程序的相关信息

<servlet>
        <servlet-name>testservlet04</servlet-name><!--Servlet程序起别名-->
        <servlet-class>com.servlet.TestServlet04</servlet-class><!--Servlet程序的全类名-->
        <!--<init-param>是初始化参数,每个servlet标签中都可以有,一个servlet标签中可以有多个-->
        <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>
    <servlet-mapping>
        <servlet-name>testservlet04</servlet-name><!--通过别名找到Servlet程序-->
        <url-pattern>/test04</url-pattern><!--在访问路径后加该标签(如:http://localhost:8080/test)-->
    </servlet-mapping>

启动tomcat,可以在控制台看到以下内容:
在这里插入图片描述

-05-ServletContext接口

ServletContext接口表示Servlet上下文对象
一个web工程只有一个ServletContext对象实例
ServletContext是在web工程启动时创建,在web工程停止时销毁
ServletContext对象是一个域对象
(域对象:像Map一样存取数据的对象称为域对象,域指的是存取数据的操作范围)
ServletContext的域是整个web工程

ServletContext接口的四个作用:
(1) 获取web.xml中配置的上下文参数标签中的值
(2) 获取当前工程的路径,格式:/工程路径,也就是Edit Configurations中Deployment中的 Application context的内容(即地址中8080之后,具体的打开的页面之前的内容)
(3) 获取工程部署后在硬盘上的绝对路径
(4) 像Map一样存取数据

创建Servlet类测试

public class TestServlet05 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //GenericServlet类中有public ServletConfig getServletConfig()方法,返回this.config
        ServletContext servletContext = getServletConfig().getServletContext();
        System.out.println(servletContext);
        System.out.println("---------------------------------------------------------");
        Enumeration<String> initParameterNames = servletContext.getInitParameterNames();
        while (initParameterNames.hasMoreElements()){
            System.out.println(initParameterNames.nextElement());
        }
        //获取context-param参数的值
        System.out.println("username="+servletContext.getInitParameter("username"));
        //获取工程路径    打印tomcatapplication context的内容,此处为空
        System.out.println("工程路径:"+servletContext.getContextPath());
        //获取工程部署后在硬盘上的绝对路径
        System.out.println("工程部署的路径是:" + servletContext.getRealPath("/"));
        System.out.println("---------------------------------------------------------");
        servletContext.setAttribute("key","value");
        System.out.println(servletContext.getAttribute("key"));
    }
}

在web.xml中添加配置

<context-param>
        <param-name>username</param-name>
        <param-value>root</param-value>
    </context-param>
    <context-param>
        <param-name>password</param-name>
        <param-value>123456</param-value>
    </context-param>
    <servlet>
        <servlet-name>testservlet05</servlet-name><!--Servlet程序起别名-->
        <servlet-class>com.servlet.TestServlet05</servlet-class><!--Servlet程序的全类名-->
    </servlet>
    <servlet-mapping>
        <servlet-name>testservlet05</servlet-name><!--通过别名找到Servlet程序-->
        <url-pattern>/test05</url-pattern><!--在访问路径后加该标签(如:http://localhost:8080/test)-->
    </servlet-mapping>

启动tomcat后控制台输出:
在这里插入图片描述

-06-HttpServletRequest常用方法与请求转发

每次请求进入服务器,Tomcat服务器就会将http信息解析之后封装在request对象, 然后传递到service方法中
(调用doGet、doPost方法),编程人员通过HttpServletRequest可以获得请求的所有信息。
HttpServletRequest类的常用方法:
getRequestURI():获取请求的资源路径
getRequestURL():获取请求的绝对路径
getRemoteHost():获取客户端的ip地址
getHeader():获取请求头
getParameter():获取请求的参数
getParameterValues():获取请求的参数(多个值时使用)
getMethod():获取请求的方式(GET或POST)
setAttribute(key, value):设置域数据
getAttribute(key):获取域数据
getRequestDispatcher():获取请求转发对象

创建Servlet类测试:

public class TestServlet06 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("RequestURI==>"+req.getRequestURI());
        System.out.println("RequestURL==>"+req.getRequestURL());
        System.out.println("IP==>"+req.getRemoteHost());
        System.out.println("Header==>"+req.getHeader("User-Agent"));
        System.out.println("Method==>"+req.getMethod());
        System.out.println("username==>"+req.getParameter("username"));
        String[] hobbies = req.getParameterValues("hobby");
        for (String hobby : hobbies) {
            System.out.println(hobby);
        }
    }
}

在web.xml中添加配置

<servlet>
        <servlet-name>testservlet06_1</servlet-name><!--Servlet程序起别名-->
        <servlet-class>com.servlet.TestServlet06_1</servlet-class><!--Servlet程序的全类名-->
    </servlet>
    <servlet-mapping>
        <servlet-name>testservlet06_1</servlet-name><!--通过别名找到Servlet程序-->
        <url-pattern>/test06_1</url-pattern><!--在访问路径后加该标签(如:http://localhost:8080/test)-->
    </servlet-mapping>

在webapp下创建一个html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<form action="http://localhost:8080/myservlet/test06_1" method="post">
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    爱好:<input type="checkbox" name="hobby" value="c++">c++
    <input type="checkbox" name="hobby" value="java">java
    <input type="checkbox" name="hobby" value="python">python
    <input type="submit">
</form>

</body>
</html>

访问:http://localhost:8080/myservlet/TestServlet06_1.html
在这里插入图片描述
点击提交之后可以看到控制台输出
在这里插入图片描述
请求转发
请求转发就是将客户端发来的请求转发到另一个资源(servlet或者jsp)。结果相当于客户端直接请求第三方。
在这里插入图片描述
代码示例:

public class TestServlet06_2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setAttribute("Fruit","Orange");
        req.getRequestDispatcher("/test06_3").forward(req,resp);
    }
}
public class TestServlet06_3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String fruit = (String)req.getAttribute("Fruit");
        System.out.println(fruit);
    }
}

配置好web.xml后访问:http://localhost:8080/myservlet/test06_2,控制台输出"Orange"

-07-base标签的作用

base标签可以设置当前页面中所有相对路径跳转时参照指定的路径来进行跳转,在href属性中设置指定路径。
举个例子:
在webapp下创建一个a文件夹,在a下创建b文件夹,在b下创建c.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>c</title>
</head>
<body>

这里是web文件夹下a下的b里面的c.html
<a href="../../d.html">跳转到web下的d.html</a>

</body>
</html>

在webapp下创建d.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>d</title>
</head>
<body>

这里是web文件夹下的d.html
<a href="a/b/c.html">跳转到c.html</a>
<a href="http://localhost:8080/myservlet/test07">请求转发到a/b/c.html</a>

</body>
</html>

在这里插入图片描述
两个页面可以互相跳转,
当使用servlet访问时,创建一个servlet:

public class TestServlet07 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.getRequestDispatcher("a/b/c.html").forward(req,resp);
    }
}

web.xml配置:

<servlet>
        <servlet-name>testservlet07</servlet-name><!--Servlet程序起别名-->
        <servlet-class>com.servlet.TestServlet07</servlet-class><!--Servlet程序的全类名-->
    </servlet>
    <servlet-mapping>
        <servlet-name>testservlet07</servlet-name><!--通过别名找到Servlet程序-->
        <url-pattern>/test07</url-pattern><!--在访问路径后加该标签(如:http://localhost:8080/test)-->
    </servlet-mapping>

访问:http://localhost:8080/myservlet/d.html,如下点击跳转
在这里插入图片描述
跳转到:
在这里插入图片描述
再次点击链接跳回去,发现404
在这里插入图片描述
注意url变成了http://localhost:8080/d.html,当然找不到c.html,这是因为在c.html页面时url是http://localhost:8080/myservlet/test07
在这里插入图片描述
访问d.html时会往路径外层跳两层,抵消掉/myservlet/test07,变成http://localhost:8080/d.html。
在这里插入图片描述
解决办法:
在c.html如下位置加上

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>c</title>
    <base href="http://localhost:8080/myservlet/a/b/">
</head>
<body>

这里是web文件夹下a下的b里面的c.html
<a href="../../d.html">跳转到web下的d.html</a>

</body>
</html>

重新访问url,问题解决。

-08-HttpServletResponse

每次只要有请求进入Tomcat服务器,Tomcat服务器就会创建一个Response对象传递给Servlet程序。
HttpServletResponse表示所有响应的信息(HttpServletRequest表示请求发来的信息),可以通过HttpServletResponse对象设置返回给客户端的信息。

public class TestServlet08 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //防止中文乱码问题,在获取流对象之前调用此方法:
        //同时设置服务器和客户端都使用UTF-8字符集
        resp.setContentType("text/html; charset=UTF-8");
        //获取流对象
        PrintWriter writer = resp.getWriter();
        writer.write("I Love China!");
    }
}

在这里插入图片描述

-09-请求重定向

重定向是服务器接受到请求后,告诉客户端再去重新请求另外一个资源。
在这里插入图片描述

方式一:使用HttpServletResponse设置请求状态码302(302代表重定向),再设置请求头的定位地址
例子:
resp.setStatus(302);//重定向
resp.setHeader(“Location”,“http://localhost:8080/myservlet/test092”);
方式二:(推荐使用)
使用HttpServletResponse调用sendRedirect()方法。

public class TestServlet09_1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("会访问到TestServlet09_1");
//        resp.setStatus(302);//重定向
//        resp.setHeader("Location","http://localhost:8080/myservlet/test092");
        resp.sendRedirect("http://localhost:8080/myservlet/test092");
    }
}
public class TestServlet09_2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //只有print、write方法、JSP的表达式脚本中的内容才可在浏览器中显示,其余Java代码的sout在控制台输出
//        resp.getWriter().print("This is 09_2");
        resp.getWriter().write("This is 09_2");
    }
}

访问url:http://localhost:8080/myservlet/test091,重定向到:在这里插入图片描述

-10- 总结

1、Servlet的创建:创建一个类继承HttpServlet,在web.xml配置servlet-mapping;
2、ServletConfig接口的四个方法可以获取对应Servlet程序的相关配置信息:
3、ServletContext接口表示Servlet上下文对象,可以获取当前工程的相关信息,是一个域对象;
4、HttpServletRequest类,可以获取请求的相关信息、存取域数据、获得请求转发对象;
5、base标签可以设置当前页面中所有相对路径跳转时参照指定的路径来进行跳转;
6、HttpServletResponse类可以设置响应数据,调用sendRedirect()方法重定向。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值