Java Web之Servlet

Servlet简介( Server Applet )

Servlet:是Java Servlet的简称,是运行在 Web 服务器中的小型 Java 程序。servlet 通常通过 HTTP(超文本传输协议)接收和响应来自 Web 客户端的请求。

在之前的例子中,我们都是在jsp页面中直接去处理逻辑,但这在实际项目开发中明显是不合适的,会导致jsp页面过多,逻辑处理过于负复杂等问题。

在实际项目,我们可以通过jsp展示数据,而数据的处理则交给servlet即可。


创建Servlet

我们以实现一个登录操作为例,先新建一个LoginServlet,别忘先导入servlet.jar

在src目录下,右键new -servlet,

这里写图片描述

输入名称,默认是勾选注解的,点击ok即可

这里写图片描述

创建好的默认代码如下

package servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "LoginServlet")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

可以看到,LoginServlet继承自HttpServlet ,默认实现了doGet和doPost方法,我们在这里就可以处理请求,idea默认给我们的servlet加上了注解,我们要手动指定一下访问路径,urlPatterns 即为指定访问路径

@WebServlet(name = "LoginServlet",urlPatterns = "/loginServlet")

如果没有注解的话,我们就要去web.xml中去配置一个对外访问的虚拟路径.

下面我们新建一个TestServlet,取消默认的注解

这里写图片描述

可以看到,新建的TestServlet没有注解,我们来手动的配置一下虚拟路径。

servlet的配置是在web.xml中

    <servlet>
        <servlet-name>TestServlet</servlet-name>
        <servlet-class>servlet.TestServlet</servlet-class><!--可以通过右键  copy Reference获得-->
    </servlet>


    <servlet-mapping>
        <servlet-name>TestServlet</servlet-name>
        <!--url-pattern中的值即为对外访问的虚拟路径-->
        <url-pattern>/TestServlet</url-pattern>

    </servlet-mapping>

可以看到,注解的方式要简洁的多,推荐使用注解的方式指定servlet的路径。

处理请求

下面我们来写一个简单的表单,将数据提交给LoginServlet处理。

表单如下,需要注意的是,LoginServlet的访问路径是:http://localhost:8080/JavaWebDemo/loginServlet,不同的项目访问路径也是不同的,所以我们需要动态的获取访问路径。

通过上面的访问路径我们可以看出该路径由协议+主机名+端口号+项目名+servlet的对外访问路径组成。
那我们先动态获取一下项目路径

<%

    /*http://localhost:8080/JavaWebDemo/loginServlet*/

    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + application.getContextPath();
%>

basePath即为动态获取的基本路径

<%--
  Created by IntelliJ IDEA.
  User: yzq
  Date: 2018/7/24
  Time: 17:04
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录</title>
</head>

<%

    /*http://localhost:8080/JavaWebDemo/loginServlet*/

    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + application.getContextPath();
%>


<body>
<form action="<%=basePath%>/loginServlet" method="post">

    账号:<input name="account"><br>
    密码:<input name="pwd"> <br>

    <br>

    <input type="submit" value="提交">


</form>
</body>
</html>

然后修改一下LoginServlet中的代码,代码很简单,从request中拿到表单数据后进行对比,这里没有连接数据库,先暂时写死,用户名密码正确则跳转至success.jsp,失败则跳转至fail.jsp.

package servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "LoginServlet", urlPatterns = "/loginServlet")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        doGet(request, response);//所有的post请求交由doGet处理

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


        System.out.println("doGet");

        String account = request.getParameter("account");
        String pwd = request.getParameter("pwd");

        System.out.println("account" + account + ",pwd" + pwd);

        if (account.equals("yzq") && pwd.equals("123")) {
            request.getRequestDispatcher("/login/success.jsp").forward(request,response);
        }else {
            request.getRequestDispatcher("/login/fail.jsp").forward(request,response);
        }
    }


}

下面我们来看看执行效果

这里写图片描述

好了,一个简单的模拟登录就完成了。


Servlet生命周期

Servlet的生命周期分为三个阶段

  1. 初始化阶段,对应init()方法,首次访问Servlet的时候执行
  2. 响应请求阶段,对应service()方法,每次处理请求时调用
  3. 销毁阶段,对应destroy()方法,servlet销毁时调用

我们将TestServlet代码修改一下

package servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


@WebServlet("/testServlet")
public class TestServlet extends HttpServlet {

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

    @Override
    public void init() throws ServletException {
        super.init();
        System.out.println("servlet第一次被访问的时候调用");
    }


    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.service(req, resp);
        System.out.println("每次处理请求时调用");
    }


    @Override
    public void destroy() {
        super.destroy();
        System.out.println("servlet销毁时调用");
    }
}

需要注意的是,init()方法只会在第一次访问时才会被调用,service()方法每次处理请求都会调用,destory()会在Servlet被移除或者服务器关闭期间被调用


ServletContext

ServletContext 代表着整个项目,我们可以在所有的Servlet中通过getServletContext()获取到该对象,对应着jsp中的application。

常用方法

        ServletContext context=getServletContext();//获取ServletContext
        String path = context.getContextPath();//获取项目路径
        context.setAttribute("","");
        context.getAttribute("");
        context.setInitParameter("","");
        context.getInitParameter("");

ServletConfig

ServletConfig是Servlet的配置对象,我们可以在web.xml或者通过注解的方式给Servlet配置一些信息,当Servlet启动的时候,这些配置信息会封装到ServletConfig对象中去,我们可以通过该对象获取配置信息。

在web.xml中通过init-param标签对Servlet进行配置。这里我们添加两条数据

    <servlet>
        <servlet-name>configServlet</servlet-name>
        <servlet-class>servlet.ConfigServlet</servlet-class>

        <init-param>
            <param-name>charset</param-name>
            <param-value>utf-8</param-value>
        </init-param>


        <init-param>
            <param-name>userName</param-name>
            <param-value>yzq</param-value>
        </init-param>

    </servlet>

    <servlet-mapping>
        <servlet-name>configServlet</servlet-name>
        <url-pattern>/configServlet</url-pattern>
    </servlet-mapping>

然后通过ServletConfig 对象获取

package servlet;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class ConfigServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        ServletConfig config = getServletConfig();//获取ServletConfig对象
        String name = config.getServletName();//获取servlet名称

        /*获取初始化参数*/
        String charset = config.getInitParameter("charset");
        String userName = config.getInitParameter("userName");

        System.out.println("ServletName:"+name);
        System.out.println("charset:"+charset);
        System.out.println("userName:"+userName);

    }

}

打印结果

这里写图片描述


Servlet注解(@WebServlet)

前面我们实际上已经使用了一部分的注解了,使用注解使我们的代码变得简洁且容易维护,不必每次创建Servlet就去web.xml中进行配置。

实际上所有在web.xml中的配置我们都可以通过注解的形式来编写。

我们通过@WebServlet关键字对Servlet进行注解,并配置相关属性

这里写图片描述

常用注解

  1. asyncSupported (Servlet是否支持异步操作模式)
  2. name( Servlet的名称)
  3. initParams ( 初始化参数 )
  4. urlPatterns ( 访问路径 )
  5. loadOnStartup (默认值为-1,当值为0或大于0时,表示服务器启动时就加载,否则,访问时才加载)

  6. 示例

package servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "AnimationServlet", urlPatterns = "/anServlet",
        initParams = {
                @WebInitParam(name = "key1", value = "value1"),
                @WebInitParam(name = "key2", value = "value2")
        })
public class AnimationServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}
©️2020 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值