1.前言
#:前言:
很多人说在2020学习Servlet就如同98年入国军,就现在的技术栈来讲在工作中用到Servlet的机会确实很小,不过熟悉Servlet能帮助我们更好的深入了解当前流行技术的一些细节,如当前火热的Spring框架中就有Servlet的存在。
#:Servlet是什么?
Servlet是Java Applet的简称,指用java编写运行在服务器上的小应用程序,用来处理客户端请求并动态生成响应内容。
1.从客户端发起请求到服务器
2.服务器(一般是Tomcat)将请求发送给Servlet
3.Servlet动态生成响应内容发送给服务器
4.服务器将响应返回给客户端
#编写Servlet程序
package com.mike;
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;
/**
* @author mike
* @date 2020-11-12
* @desc 使用注解@WebServlet配置servlet
*/
@WebServlet(name="MyServlet",value="/helloServlet")
public class MyServlet extends HttpServlet {
public MyServlet() {
super();
}
@Override
protected void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException {
System.out.println("get 请求执行");
}
@Override
protected void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException {
System.out.println("post 请求执行");
}
}
1.定义一个类MyServlet继承HttpServlet类并重写其中doGet()及doPost方法,并返回一句话"get 请求执行"
2.使用注解@WebServlet(name="MyServlet",value="/helloServlet")来指定访问此Servlet的路由名称,其中name为Servlet名称,value为路由名称
3.编译后代码后,在tomcat服务器启动状态下打开浏览器输入 http://localhost:8080/helloServlet
4.观察tomacat catalina日志中打印日志
#Servlet生命周期
1.容器加载MyServlet.class字节码文件
2.容器调用其构造方法
3.容器调用init()方法初始化,在此会初始化ServletConfig对象
4.容器调用service()方法,并调用doGet()或doPost()方法处理客户端端请求
5.容器关闭时调用destroy()方法释放资源
#ServletConfig对象
在init()方法调用时读取web.xml文件中init-param配置信息并初始化ServletConfig对象
打开web.xml文件添加一个servlet
<servlet>
<!-- servlet-name属性表示当前servlet的内部自定义名称-->
<servlet-name>config</servlet-name>
<!-- servlet-class属性表示servlet的真实类名称-->
<servlet-class>com.mike.ServletConfigDemo</servlet-class>
<!-- 初始参数:这些参数会在加载web应用的时候,封装到ServletConfig对象中 -->
<init-param>
<param-name>name</param-name>
<param-value>mike</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123456</param-value>
</init-param>
<!-- 让servlet对象自动加载,注意:init-param要在自动加载之前 -->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 配置servlet和路由映射关系-->
<servlet-mapping>
<!-- servlet-name为上文中servlet内部名-->
<servlet-name>config</servlet-name>
<!-- 将当前servlet绑定到路由名称可在地址栏访问-->
<url-pattern>/config</url-pattern>
</servlet-mapping>
编写ServletConfigDemo类文件
package com.mike;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author mike
* @date 2020-11-15
* desc 使用ServletConfig对象获取初始化参数
*/
public class ServletConfigDemo extends HttpServlet {
public ServletConfigDemo() {
super();
}
@Override
public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException {
doPost(request,response);
}
@Override
public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException {
ServletConfig config = getServletConfig();
String name = config.getInitParameter("name"); //利用name获取配置值
String password = config.getInitParameter("password");
System.out.println("name: " + name + " password:" + password);
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<HEAD><TITLE>初始化信息</TITLE></HEAD>");
out.println("姓名:" + name + "<br>");
out.println("密码:" + password + "<br>");
out.flush();
out.close();
}
}
访问http://localhost:8080/config,观察输出
#ServletContext对象
ServletContext是servlet上下文对象,各Servlet之间可以通过ServletContext共享信息
在web.xml添加context-param配置
<!--注意,context-param必须放在servlet配置外面,它不属于任何servlet,而属于整个应用配置-->
<context-param>
<param-name>name</param-name>
<param-value>mike</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>8888</param-value>
</context-param>
新建ServletContextDemo类文件
package com.mike;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author mike
* @date 2020-11-18
* desc 使用ServletContext获取整个web应用的配置信息
*/
public class ServletContextDemo extends HttpServlet {
public ServletContextDemo() {
super();
}
@Override
public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException {
doPost(request,response);
}
public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException {
ServletContext context = getServletContext();
Enumeration<String> names = context.getInitParameterNames();
while(names.hasMoreElements()) {
String name = names.nextElement();
String value = context.getInitParameter(name);
System.out.println(name+":"+value);
}
}
}
访问http://localhost:8080/context 查看输出信息
新建ServletContextDemo2类文件
package com.mike;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import java.io.IOException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author mike
* @date 2020-11-18
* desc 测试多个servlet利用context通信
*/
@WebServlet(name="ServletContextDemo2",value = "/context2")
public class ServletContextDemo2 extends HttpServlet{
public ServletContextDemo2() {
super();
}
@Override
public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
doPost(request,response);
}
@Override
public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException {
ServletContext context = getServletContext();
String name = "xiuyue";
String password = "1234";
context.setAttribute("name",name);
context.setAttribute("password",password);
}
}
最后新建新建ServletContextDemo3类文件
package com.mike;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author mike
* @date 2020-11-18
* desc 测试多个servlet利用context通信
*/
@WebServlet(name="ServletContextDemo3",value = "/context3")
public class ServletContextDemo3 extends HttpServlet{
public ServletContextDemo3() {
super();
}
@Override
public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
doPost(request,response);
}
@Override
public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException {
ServletContext context = getServletContext();
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("姓名" + context.getAttribute("name") + "<br>");
out.println("密码" + context.getAttribute("password"));
out.close();
}
}
分别运行http://localhost:8080/context2,http://localhost:8080/context3查看输出信息
姓名xiuyue
密码1234
当运行context2时会修改第一次定义的配置信息,而context3会将修改后信息读取,这就说明ServletContext是对所有Servlet共享的
#Servlet重定向
package com.mike;
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;
/**
* @author mike
* @date 2020-11-12
* @desc 测试servlet重定向
*/
@WebServlet(name="MyServlet",value="/helloServlet")
public class MyServlet extends HttpServlet {
public MyServlet() {
super();
}
@Override
protected void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException {
response.sendRedirect("http://www.baidu.com");
}
}
访问http://localhost:8080/helloServlet查看结果,网页被重定向到baidu