文章目录
1 Servlet简介和配置
1.1 Servlet的简介
Servlet是JavaWeb三大组件之一,Servlet是JavaEE规范之一,规范就是接口,Servlet就是运行在服务器上的一个Java程序可以通过HTTP协议接收客户端发送来的请求,并回传给客户端
JavaWeb三大组件
Servlet程序 Filter过滤器 Listener监听器
在Web程序中,前端的界面负责与用户交互,而后台用来处理逻辑和数据,可以通过Servlet将前端的数据传给后台
回看HTML的form标签:
<form action="" method="">
<input type="text" name="userName">
<input type="password" name="password">
<input type="submit">
</form>
action:
填写处理该表单数据的Servlet程序
不同的表单就是不同的业务由不同的Servlet程序处理
method:
可以选择get或post
form标签用来传递数据,将用户输入的数据通过Servlet传递到后台进行逻辑处理,一个Web工程有多个页面,多个form标签,负责登录,注册,搜索等等功能,当用户通过form标签提交数据后,不同的form标签由不同的Servlet程序负责处理
1.2 创建Servlet程序
创建Servlet程序前,需要先创建一个Web工程,Web工程的创建方式有两种
方式1,创建普通Java工程,通过add Framework support的形式
方式2,创建Java Enterpise工程
通过方式1的形式创建的Web工程,在使用有关Servlet的API前,需要将servlet-api.jar文件导入到工程中,这个jar文件就在Tomcat的lib目录下
在WEB-INF目录下创建一个lib目录将servlet-api.jar粘贴到此,并通过add as Library的方式添加方可使用有关Servlet的API
通过方式2的形式创建的Web工程,配置好Maven后可以直接使用
1.2.1 实现Servlet接口
通过实现Servlet接口创建Servlet程序的步骤
1,编写一个Servlet接口的实现类
2,实现service方法,分类处理get和post请求
3,在web.xml文件中配置此Servlet程序
实现Servlet接口并实现需要的方法:
/**
* @author 雫
* @date 2021/4/24 - 12:55
* @function 实现Servlet接口来创建Servlet程序
*/
public class MyServlet implements Servlet {
public MyServlet() {
System.out.println("无参构造生成Servlet实例");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("Servlet实例初始化");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
// 处理来自客户端的请求
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("MyServlet被访问");
// 为了能得知是get请求还是post请求 需要区分本次请求是哪种类型 HttpServletRequest有着getMethod()方法
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
// 获取请求的方式 是GET或POST
String requestType = httpServletRequest.getMethod();
if("GET".equals(requestType)) {
System.out.println("执行get请求的方法");
doGet();
} else {
System.out.println("执行post请求的方法");
doPost();
}
}
// 执行get请求的操作
private void doGet() {}
// 执行post请求的操作
private void doPost() {}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("Servlet实例被销毁");
}
}
在web.xml文件中配置该Servlet程序:
<!-- servlet标签给Tomcat配置servlet程序 -->
<servlet>
<!-- 给servlet程序起一个别名 一般为类名 -->
<servlet-name>MyServlet</servlet-name>
<!-- 给出servlet程序所在的类全名 -->
<servlet-class>com.coisini.servlet.MyServlet</servlet-class>
</servlet>
<!-- 给servlet程序配置一个访问地址 -->
<servlet-mapping>
<!-- 告诉服务器当前配置的地址给哪个servlet程序使用 -->
<servlet-name>MyServlet</servlet-name>
<!-- 配置访问地址
这里的 / 就是工程路径 需要和Tomcat配置的虚拟路径相同
在浏览器中输入localhost:8080/MyServlet
就可以访问到MyServlet程序
-->
<url-pattern>/MyServlet</url-pattern>
</servlet-mapping>
1.2.2 继承HttpServlet类
实现接口过于麻烦,且Servlet接口中的service方法不能区分get和post请求,还需要自己进行处理,所以一般不采用
通过继承HttpServlet类来创建Servlet程序的步骤:
1,编写一个类,继承HttpServlet类
2,根据业务需求,重写doGet和doPost中的方法
3,在web.xml文件中配置此Servlet程序
继承HttpServlet类并重写doGet和doPost方法:
/**
* @author 雫
* @date 2021/4/24 - 14:12
* @function
*/
public class MyServlet2 extends HttpServlet {
// get请求时被调用
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
System.out.println("doGet");
}
// post请求时被调用
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
System.out.println("doPost");
}
}
在web.xml文件中配置此Servlet程序:
<servlet>
<servlet-name>MyServlet2</servlet-name>
<servlet-class>com.coisini.servlet.MyServlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet2</servlet-name>
<url-pattern>/MyServlet2</url-pattern>
</servlet-mapping>
1.2.3 IDEA快速生成
在IDEA中可以快速生成Servlet类,只需要在web.xml文件中完善Servlet程序的配置即可
1,src-> 右键 -> new -> create new Servlet
-> 配置ServletName Package ServletClass
-> 取消注解 -> ok
-> web.xml中配置<servlet-mapping> 配置地址
使用IDEA快速生成Servlet程序的过程:


生成的Servlet程序:
/**
* @author 雫
* @date 2021/4/24 - 14:39
* @function
*/
public class MyServlet3 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
后续在web.xml文件中配置Servlet程序即可,如果src的new选项下没有create New Servlet选项,需要设置一下当前src路径为sources并勾选Facets中的Source Roots选项


1.3 Servlet的生命周期
Servlet是运行在服务器上的,有着自己的生命周期
看一个实现Servlet接口的Servlet程序:
/**
* @author 雫
* @date 2021/4/24 - 12:55
* @function
*/
public class MyServlet implements Servlet {
public MyServlet() {
System.out.println("无参构造生成Servlet实例");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("Servlet实例初始化");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("MyServlet被访问");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("Servlet实例被销毁");
}
}
其中的构造方法,init方法,service方法,destroy方法在Servlet不同的生命周期被执行
创建Servlet实例时
构造方法和init方法被调用
收到来自客户端的请求时
service方法被调用
Tomcat停止运行时
destroy方法被调用,Servlet实例被销毁
1.4 Servlet的简单使用
在index.jsp中创建3个表单,表单提交的数据种类不同,提交的方式也不同,这3个表单准备由3个不同的Servlet程序来处理

三个不同的Servlet程序负责处理3张表单的数据提交:
/**
* @author 雫
* @date 2021/4/24 - 16:48
* @function 处理表单1的Servlet程序
*/
public class MyServlet1 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("表单1的数据以post的方式提交");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("表单1的数据以get的方式提交");
}
}
/**
* @author 雫
* @date 2021/4/24 - 16:49
* @function 处理表单2的Servlet程序
*/
public class MyServlet2 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("表单2的数据以post的方式提交");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("表单2的数据以get的方式提交");
}
}
/**
* @author 雫
* @date 2021/4/24 - 16:50
* @function 处理表单3的Servlet程序
*/
public class MyServlet3 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("表单3的数据以post的方式提交");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("表单3的数据以get的方式提交");
}
}
web.xml文件中Servlet程序的配置:
<!-- 处理表单1 -->
<servlet>
<servlet-name>MyServlet1</servlet-name>
<servlet-class>com.coisini.servlet.MyServlet1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet1</servlet-name>
<url-pattern>/MyServlet1</url-pattern>
</servlet-mapping>
<!-- 处理表单2 -->
<servlet>
<servlet-name>MyServlet2</servlet-name>
<servlet-class>com.coisini.servlet.MyServlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet2</servlet-name>
<url-pattern>/MyServlet2</url-pattern>
</servlet-mapping>
<!-- 处理表单3 -->
<servlet>
<servlet-name>MyServlet3</servlet-name>
<servlet-class>com.coisini.servlet.MyServlet3</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet3</servlet-name>
<url-pattern>/MyServlet3</url-pattern>
</servlet-mapping>
使用示例:

可以看到用不同的Servlet程序处理了不同的表单,每次提交时,负责该表单的Servlet程序就会收到请求数据作出处理

4680

被折叠的 条评论
为什么被折叠?



