Java Servlet

1. Servlet进行动态网页开发

1.1. 用于开发动态的网页

书写流程:

  1. 写一个class类,去继承一个Httpservlet
  2. 重写service方法,注意一定要super.service()
  3. 进行动态网页的开发
  4. 在web.xml中配置
xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
		  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5">
    <servlet>
        <servlet-name>Servlet01</servlet-name>
        <servlet-class>com.wyb.servlet.Servlet01</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Servlet01</servlet-name>
        <url-pattern>/servlet/Servlet01</url-pattern>
    </servlet-mapping>
</web-app>

注意:servlet-name是自己任意命名的,url-pattern也是的

  1. 在网页中访问即可输入自己定义的url-pattern即可

1.2. 使用Servlet进行流程控制

  1. 进行流程的控制(重要的作用)
java 复制代码
public class DoLogin extends HttpServlet{
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1. 接收login.jsp页面发送过来的数据
        String uname = request.getParameter("uname");
        String pwd = request.getParameter("pwd");
        // 2. 数据处理,得到结果--使用接收的数据去数据库做比较
        boolean flag = false;
        if("wyb".equals(uname) && "123".equals(pwd)) {
            flag = true;
        }
        // 3. 根据返回的结果给用户作出响应
        if(flag) {
            // 可以实现页面的跳转-转发
            request.getRequestDispatcher("admin/success.jsp").forward(request, response);
        } else {
            request.getRequestDispatcher("admin/login.jsp").forward(request, response);
        }
    }
}

总结:

  • Servlet是一个基于Java技术的动态网页技术,运行在服务器端,由Servlet容器管理,用于生成动态的内容,是JSP的前身,编写一个Servlet,实际上就是按照Servlet规范编写一个java类
  • Servlet是由Tomcat管理,没有main()方法
  • JSP的本质是一个Servlet
    • JSP执行过程:.jsp--翻译--.java(Servlet)--编译--.class--执行

2. Servlet生命周期

2.1. 生命周期

Servlet是一个单实例,多线程的程序

  1. 类加载:Class clazz = Class.forName("com.wyb.servlet");
  2. 实例化(离不开反射):Object obj = clazz.newInstance();
  3. 初始化(离不开反射)
  4. 服务请求(service)(离不开反射)
  5. 销毁操作(离不开反射)

2.2. 类加载时机

  1. 默认第一次访问Servlet进行类加载
  2. <load-on-startup>0</load-on-startup>(当启动服务器时加载)数字越小加载时机越往前
java 复制代码
public class Servlet01 extends HttpServlet {
    // 实例化方法,只执行一次
    public Servlet01() {
        System.out.println("Servlet01");
    }
    // 请求服务-每一次请求都会执行
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) {
        System.out.println("Servlet01 doGet");
    }
    // 请求服务-每一个请求都会执行
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) {
        System.out.println("Servlet01 doPost");
    }
    // 判断调用doGet还是doPost,执行多次
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) {
        // 获得传递的方法名称-GET/POST
        String method = request.getMethod();
        System.out.println(method);
        if("GET".equals(method)) {
            doGet(request, response);
        }else if("POST".equals(method)) {
            doPost(request, response);
        }else {
            System.out.println("执行其他方法");
        }
    }
    // 销毁操作,关闭服务器执行一次
    @Override
    public void destroy() {
        System.out.println("Servlet01 destroy");
    }
    // 初始化方法-执行一次
    @Override
    public void init() {
        System.out.println("Servlet01 init");
    }
}

3. Servlet API

3.1. 书写Servlet的方式

  • Servlet必须直接或间接实现javax.servlet.Servlet接口
  • 通过继承javax.servlet.GenericServlet类实现跨协议的Servlet
  • 通过继承javax.servlet.HttpServlet实现HTTP Servlet
  • 自己定义Servlet,其他的java类都继承此Servlet

3.2. 接口和类

  • Servlet接口:所有的Servlet直接或间接实现的类
    • init(ServletConfig config)
    • service(ServletRequest req, ServletResponse res)
    • destory()
    • getServletInfo():获得Servlet信息
    • getServletConfig():获得Servlet相关配置信息
  • GenericServlet抽象类:implements Servlet, ServletConfig
    • 定义了一个通用的,不依赖于具体协议的Servlet,给出了除service()方法的其余四个方法的实现
    • public void init(ServletConfig config) throws SerletException; protected void init() throws SerletException第一个是Servlet接口的init(),调用第二个init(),重写第二个init()接口
  • HttpServlet类
    • public void service(ServletRequest req, ServletResponse res)
    • protected void service(HttpServletRequest req, HttpServletResponse res)
    • protected void doGet(req, res)
    • protected void doPost(req, res)
    • public service()是父类的方法,protected service()是自己的方法。根据HTTP请求方法的类型调用相应的doXxx()方法
    • 自己编写的Servlet应该继承HttpServlet,一般要覆盖Service或doPost/doGet方法

4. 参数读取

  1. 配置参数读取的意义:把参数提取到配置的信息中,大大增加了代码的实用性,方便维护
java 复制代码
public class ParamServlet extends HttpServlet {
    String enc;
    String encc;
    String enc2;
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
        System.out.println("初始化参数:" + enc);
        System.out.println(encc);
        System.out.println("上下文参数:" + enc2);
    }
    @Override
    public void init() {
        // 获得初始化参数
        enc = this.getInitParameter("enc");
        encc = this.getServletConfig().getInitParameter("enc");
        // 获取上下文参数,this.getServletContext(): 获得全局的对象
        enc2 = this.getServletContext().getInitParameter("enc2");
        System.out.println("读取初始化参数完毕");
    }
}

4. 中文乱码处理

  1. post方式:request.setCharacterEncoding("utf-8")
  2. get方式:
    1. byte[] bytes = str.getBytes("iso-8859-1"); String cstr = new String(bytes, "utf-8");
    2. 在server.xml中指定对应的服务器编码:URIEncoding = "utf-8"
相关推荐
九圣残炎11 分钟前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode
wclass-zhengge13 分钟前
Netty篇(入门编程)
java·linux·服务器
童先生15 分钟前
Go 项目中实现类似 Java Shiro 的权限控制中间件?
开发语言·go
lulu_gh_yu16 分钟前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
Re.不晚40 分钟前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
老秦包你会42 分钟前
Qt第三课 ----------容器类控件
开发语言·qt
凤枭香1 小时前
Python OpenCV 傅里叶变换
开发语言·图像处理·python·opencv
雷神乐乐1 小时前
Maven学习——创建Maven的Java和Web工程,并运行在Tomcat上
java·maven
ULTRA??1 小时前
C加加中的结构化绑定(解包,折叠展开)
开发语言·c++
码农派大星。1 小时前
Spring Boot 配置文件
java·spring boot·后端