Javaweb-Servlet总结(概述接口使用配置获取请求方式路径操作Request对象Response对象)
Posted Ocean:)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Javaweb-Servlet总结(概述接口使用配置获取请求方式路径操作Request对象Response对象)相关的知识,希望对你有一定的参考价值。
文章目录
Servlet概述
-
即Server Applet
-
Servlet 是 JavaWEB 服务端的一个小程序,主要用户用户数据的交互,WEB 数据展示和数据传递,是一个动态的资源
-
Servlet 程序可以应对搜友类型的请求和响应,Servlet 主要用于 HTTP 协议的 WEB 服务器程序实现
-
Servlet 开发需要用到两个包
javax.servlet
javax.servlet.http
-
开发中可能会涉及到的接口和类
javax.servlet.http.Servlet
javax.servlet.http.GServlet --abstract修饰的类
javax.servlet.http.HttpServlet
javax.servlet.http.HttpServletRequest
javax.servlet.http.HttpServletResponse
javax.servlet.http.HttpSession
javax.servlet.http.Cookie
demo
以一个实例来说明 get 请求和 post 请求,前端有两个按钮分别是以 get 方式提交数据和以 post 方式提交数据
前端html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test</title>
</head>
<body>
<form action="ServletDemo" method="get">
<input type="submit" value="GET请求"><br>
</form>
<form action="ServletDemo" method="post">
<input type="submit" value="POST请求"><br>
</form>
</body>
</html>
后端代码ServletDemo
package cn.ocean888.demo1;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 1.继承HttpServlet interface
* 2.重写doget、dopost
* 3.使用注解方式告知tomcat服务器当前Servlet的路由
*/
@WebServlet("/test")
public class ServletDemo extends HttpServlet {
/**
* 处理GET请求
* @param req HttpServletRequest对象,对应当前浏览器请求数据内容对应的对象
* @param resp HttpServletResponse对象,对应是当前浏览器对于浏览器请求的响应
* @throws ServletException Servlet异常
* @throws IOException IO异常
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
/**
* 处理post请求
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*
通常情况下,浏览器或者客户端发送数据的请求方式只有一种,对应GET请求和POST请求,在实现Servlet代码时,
针对GET和POST完成对应的方法,此处使用doget,实现所有的业务逻辑
*/
//super.doPost(req, resp);
System.out.println("post请求方式");
doGet(req, resp);
}
}
Servlet核心接口和类
interface.javax.servlet.Servlet【核心接口】
Defines methods that all servlets must implement.
当前接口中所有的Servlet程序必须实现
A servlet is a small Java program that runs within a Web server
Servlet是一个小的Java程序,需要运行在WEB服务器当中。
Servlet接口中定义了5个方法
public void init(ServletConfig config) throws ServletException;
初始化当前Servlet程序,这里需要的参数是ServletConfig,ServletConfig
是当前Servlet的配置,该配置可以从注解方式或者从当前项目中的web.xml加载
获取
public ServletConfig getServletConfig();
获取ServletConfig对象,当前对象中保护Servlet配置内容。
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException;
【核心方法】Servlet提供服务的方法,浏览器访问当前Servlet程序,service
方法是起作用,ServletRequest对应的是请求,ServletResponse对应的是响
应
public String getServletInfo();
获取当时Servlet程序信息对应字符串
public void destroy();
销毁当前Servlet程序,可以由Tomcat服务器执行,也可也通过servlet程序自己
调用
abstract javax.servlet.GenericServlet【Servlet中间商】
功能是完成了Servlet接口和ServletConfig接口的一部分方法,简化了之后代码的逻辑,主要需要了解的方法:
public String getInitParameter(String name);
根据初始化参数名字获取对应的值,而且参数值为String
public Enumeration<String> getInitParameterNames();
获取所有参数的名字。枚举类型的List
public ServletConfig getServletConfig();
获取ServletConfig对象
public ServletContext getServletContext();
获取ServletContext对象,一个Servlet Application有且只有一个
ServletContext对应,这是Servlet上下文对象
这里同时实现了Servlet接口中的 init 初始化方法
abstract javax.servlet.http.HttpServlet 【Servlet程序基类】
abstract javax.servlet.http.HttpServlet 这是一个Java中符合Http协议的Servlet程序,继承GenericServlet,同时是Servlet接口和ServletConfig间接实现类。
HttpServlet中首先实现service核心方法,并且将service核心方法的请求方式,响应方式强转为符合Http协议的请求和响应 所有和Servlet业务逻辑无关的初始化方法,设置方法,销毁方法,HttpServlet中全部不需要考虑,只考虑符合Http协议请求方式和响应方式
核心方法:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
符合HTTP GET请求的处理方式
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
符合HTTP POST请求的处理方式
【注意】
以上方法不重写,或者执行还是对应的方法,例如super.doGet(req,resp), 响应方式会提示报错 SC_METHOD_NOT_ALLOWED
三种自定义Servlet接口的方法
1.实现Servlet接口
package com.qfedu.b_threeFunction;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
/**
* 遵从Servlet接口实现Servlet程序
* 代码中存在太多和业务逻辑无关的代码,增加了程序员的压力!!!
* 不可取!!!
*/
@WebServlet("/ServletImpl")
public class ServletImpl implements Servlet {
/**
* 构造方法
*/
public ServletImpl() {
System.out.println("ServletImpl Constructor called");
}
/**
* 初始化方法
*
* @param config 需要使用ServletConfig类对象,也就是Servlet配置来完成初始化操作
* @throws ServletException Servlet异常
*/
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("init method called");
}
/**
* 获取ServletConfig对象
*
* @return 获取ServletConfig对象
*/
@Override
public ServletConfig getServletConfig() {
return null;
}
/**
* 提供服务核心方法
*
* @param req ServletRequest对象
* @param res ServletResponse对象
* @throws ServletException Servlet异常
* @throws IOException IO异常
*/
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("service method called");
}
/**
* 获取Servlet信息
* @return
*/
@Override
public String getServletInfo() {
return null;
}
/**
* 销毁Servlet
*/
@Override
public void destroy() {
System.out.println("destroy method called");
}
}
2.继承GenericServlet抽象类
package com.qfedu.b_threeFunction;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
/**
* 继承GenericServlet 抽象类实现Servlet程序
* 对应Servlet接口,在继承GenericServlet情况下,我们需要完成的方法有且
* 只有service核心方法。
*
* 代码量明显减少,同时和业务逻辑无关的代码不需要考虑,但是没有针对性,
* 没有对应Http协议请求方式的对应处理方法
*
* @author MI 2020/3/30 11:30
*/
@WebServlet("/GenericServletExtends")
public class GenericServletExtends extends GenericServlet {
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("GenericServletExtends service method called");
}
}
3.继承HttpServlet抽象类
package com.qfedu.b_threeFunction;
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;
/**
* 继承HttpServlet实现符合HTTP协议的Servlet程序
* 并且可以自定义实现请求方式的对应处理方法
*
* @author MI 2020/3/30 11:34
*/
@WebServlet("/HttpServletExtends")
public class HttpServletExtends extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HttpServletExtends doGet or doPost method called");
resp.getWriter().append("Hello Servlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
【注意】
继承HttpServlet重写HttpServlet对应HTTP协议的处理方法,一定要完成,如果未完成或者说依然执行调用的是HttpServlet中的方法,
会有错误出现 405 Method Not Allow
平时主要用的就是这种方式
生命周期
tomcat管理Servlet程序的声明周期,主要涉及4个方法
- Constructor方法
- init初始化方法
- service方法
- destory销毁方法
概述
-
阶段一
Constructor方法执行,实例化过程。Tomcat中的Servlet容器调用Servlet程序对应的构造方法创建Servlet类对象
前提条件:
- 当前Servlet程序需要被执行
- 当前Servlet程序配置了开机启动
而且Constructor有且只执行一次
-
阶段二:
init(ServletConfig config) 初始化方法,当Servlet程序创建之后一定要对当前Servlet程序进行初始化过程,需要使用ServletConfig对象完成初始化操作,ServletConfig对象中是从注解或者web.xml中获取对应的配置信息,完成初始化操作,而且只执行一次
-
阶段三:
service方法提供服务
当前Servlet程序准备完毕,Servlet程序是在被请求时执行service方法,完成对应请求和响应的执行过程。到HttpServlet抽象类中对于service方法实现,并且按照HTTP请求方式完成划分工作。比如doGet doPost -
阶段四:
Tomcat服务器中Servlet容量对于Servlet进行销毁过程,有几种情况下会执行destroy方法
- Tomcat服务器关闭,Servlet容器会执行每一个Servlet程序的destroy方法
- 当前Servlet程序执行过程中,存在特定条件选择关闭
- 通常情况下Servlet容器对于Servlet程序的管理是自动完成的,不需要人为干预
配置方式
Servlet3.0之后允许使用注解方式配置
属性名 | 概述 |
---|---|
name | Servlet名字,可以自定义 |
value | url资源匹配方式,和urlPatterns互斥 |
urlPatterns | 允许当前Servlet有多个匹配方式,和value互斥 |
loadOnStartup | 是否启动服务时加载当前Servlet,默认 -1,选择加载 1 |
initParams | WebInitParam 注解类型 name和value 当前Servlet配置初始化配置 |
@WebServlet(name = "AnnotationServlet",
urlPatterns = {"/AnnotationServlet", "/as", "/saolei"},//允许多个匹配规则
loadOnStartup = 1,
initParams = {@WebInitParam(name = "aa", value = "ocean"), @WebInitParam(name = "bb", value = "46号技师")})//初始化参数
public class AnnotationServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Annotation Config Servlet");
String aa = this.getServletConfig().getInitParameter("aa");//获取初始化参数
String bb = this.getServletConfig().getInitParameter("bb");
System.out.println(aa);
System.out.println(bb);
resp.getWriter().append("Annotation Config Servlet");
}
}
任何一个版本都允许使用web.xml配置
<!-- web.xml 配置文件 -->
<?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_3_1.xsd"
version="3.1">
<!-- Servlet 程序声明,告知Servlet程序对应的名字和Servlet程序对应的class -->
<servlet>
<!-- ServletName -->
<servlet-name>WebXmlServlet</servlet-name>
<!-- Servlet对应的class,该名字必须是完整的包名.类名 -->
<servlet-class>cn.ocean.WebXmlServlet</servlet-class>
<!-- 当前Servlet程序初始化操作,需要放在servlet-class之后 -->
<init-param>
<param-name>param1</param-name>
<param-value>ocean</param-value>
</init-param>
<init-param>
<param-name>param2</param-name>
<param-value>ocean</param-value>
</init-param>
<!-- 当前Servlet随着Tomcat服务器启动加载 -->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Servlet映射关系 -->
<servlet-mapping>
<!-- 告知Tomcat服务器,当前url-pattern映射的是哪一个Servlet -->
<servlet-name>WebXmlServlet</servlet-name>
<!-- URL匹配原则 -->
<url-pattern>/WebXmlServlet</url-pattern>
</servlet-mapping>
<!-- Servlet映射关系 -->
<servlet-mapping>
<!-- 告知Tomcat服务器,当前url-pattern映射的是哪一个Servlet -->
<servlet-name>WebXmlServlet</servlet-name>
<!-- URL匹配原则 -->
<url-pattern>/wxs</url-pattern>
</servlet-mapping>
</web-app>
两种方式对比
注解
配置简单,直观,高效
url-pattern 冲突问题,并且是在Tomcat启动时发现,需要注意细节
web.xml
繁琐,麻烦,步骤繁多
url-pattern 一旦写错或者冲突,web.xml文件会提示错误!!!
Servlet获取请求数据
【注意】
1. 要求前端提交数据的name属性和后台获取getParameter参数一致
2. 在后台通过HttpServletRequest获取数据使用getParameter方法,返回值是String类型
前端代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>02-ParameterUpload</title>
</head>
<body>
<form action="GetParameterServlet" method="get">
<span>姓名:</span><input type="text" name="userName"> <br>
<span>密码:</span><input type="password" name="password"> <br>
<input type="submit" value="提交">
</form>
<hr>
<form action="GetParameterServlet" method="post">
<span>姓名:</span><input type="text" name="userName"> <br>
<span>密码:</span><input type="password" name="password"> <br>
<input type="submit" value="提交">
</form>
</body>
</html>
后端代码
/**
* 获取前端通过HTTP请求方式发送过来的数据
*
* @author MI 2020/3/30 16:02
*/
@WebServlet("/GetParameterServlet")
public class GetParameterServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 浏览器通过form表单提交的数据都在HttpServletRequest对象中
// 通过getParameter获取对应的参数名数据,参数名和form表单中的name属性一致
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以上是关于Javaweb-Servlet总结(概述接口使用配置获取请求方式路径操作Request对象Response对象)的主要内容,如果未能解决你的问题,请参考以下文章
JavaWeb-Servlet笔记--- 监听器接口;应用监听器接口 优化在线考试管理系统
JavaWeb-Servlet笔记--- Servlet规范;Servlet接口实现类;Servlet对象生命周期;HttpServletResponse/HttpServletRequest;请求对