- 前言
- 一、Servlet是什么?
- 二、Servlet执行原理.
- 三、Servlet的生命周期.
- 四.Servlet注解配置3.0
- 4.2.1@WebServlet底层原理介绍
- 五.Servlet的体系结构
- 六.response
- 6.1.1 request基本原理:
- 6.2.1 要点:
- 6.2.2 获取请求行数据:
- 6.2.3 获取请求头数据:
- 七.通用请求方式
前言
提示:以下是本篇文章正文内容,下面案例可供参考.我不是创造知识的人,只是知识的搬运工…希望大家能够通过本篇文章了解前辈们的设计造诣.
一、Servlet是什么?Servlet是一个java接口,定义了java类被tomcat识别的规则.
二、Servlet执行原理.Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和
HTTP 服务器上的数据库或应用程序之间的中间层。
使用Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
–菜鸟教程
三、Servlet的生命周期.执行原理∶
1,当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的servlet的资源路径
2.查找web.xml文件,是否有对应的标签体内容。
3.如果有,则在找到对应的全类名
4. tomcat会将字节码文件加载进内存(Class.forName())
并且创建其对象newInstance()
5.调用其方法–service
//init 方法只调用一次,创建 Servlet 时被调用.即Servlet是单例的,只存在一个对象。
//多线程访问,共享对象可能存在安全问题.
//解决:尽量不要在servlet中定义成员变量.即使定义了成员变量,也不要修改值.
public void init() throws ServletException {
// 初始化代码...
system.out.print("init.....");
}
//Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException{
system.out.print("service.....");
}
//destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用(服务器正常被关闭).
public void destroy() {
// 终止化代码...
}
四.Servlet注解配置3.0
好处:不需要web.xml
1.创建JavaEE项目,选择servlet的版本3.0以上,可以不创建web.xml
2.定义一个类,实现servlet接口
3.重写方法
4.在类上使用@webservlet注解,进行配置
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet(name = "Servlet", value = "/Servlet")
public class Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
4.2.1@WebServlet底层原理介绍
原理:
首先,浏览器发出请求后,经过过滤器。过滤器执行初始init方法。工具类扫描配置文件中指定的包。扫描工具把指定包下的所有类的字节码文件存放到Set集合中,然后遍历set集合,如果set集合中的元素(包中的各个类的字节码文件)用的是WebServlet.class这个注解类型编写开发的,那么就获取当前set元素的在注解中定义的value值(URI地址),这个value值在注解接口WebServlet中定义的是Servlet的访问URI。因此过滤器的初始化init()方法就把"指定包下的所有使用WebServlet注解开发的普通类的字节码文件"作为值value,使用注解中的String value()定义了Servlet访问的URI 作为键key, 存放到 Map
原理出处:https://www.cnblogs.com/huangdabing/p/9219444.html
@WebServlet("资源路径")
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@documented
public @interface WebServlet {
String name() default "";//指定servlet的name属性,相当于,没有写则为全类名
String[] value() default {};//代表urlPatterns()属性配置,等价于urlPatterns,二者不能共存
String[] urlPatterns() default {};//指定一组servlet的url,相当于
int loadOnStartup() default -1;//指定servlet的加载顺序,相当于
WebInitParam[] initParams() default {};//相当于标签.
boolean asyncSupported() default false;//servlet是否开启异步操作,相当于标签.
String smallIcon() default "";
String largeIcon() default "";
String description() default "";//servlet的描述信息,相当于标签.
String displayName() default "";//servlet的显示名,相当于标签.
}
五.Servlet的体系结构
六.response
6.1.1 request基本原理:
6.2.1 要点:1.tomcat服务器会根据请求url中的资源路径,创建对应的Servlet实现类的对象。
2.tomcat服务器,会创建request和response对象,request对象中封装请求消息数据。
3.tomcat将request和response两个对象传递给service方法,并且调用service方法。
4.程序员可以通过request对象获取请求消息数据,通过通过response对象设置响应消息数据.
5.服务器在给浏览器做出响应之前,会从response对象中拿程序员设置的响应消息数据。
1.request和response对象是由服务器创建的。我们来使用它们.
2.request对象是来获取请求消息,response对象是来设置响应消息
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet(name = "Servlet", value = "/Servlet")
public class Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取请求方式,GET
String method = request.getMethod();
System.out.println(method);
//2.(*)获取虚拟目录: servlet01
String contextPath = request.getContextPath();
System.out.println(contextPath);
//3.获取Servlet路径
String servletPath = request.getServletPath();
System.out.println(servletPath);
//4.获取get方法请求参数: null
String queryString = request.getQueryString();
System.out.println(queryString);
//5.(*)获取请求URI:servlet01/Servlet
String requestURI = request.getRequestURI();
StringBuffer requestURL = request.getRequestURL();
System.out.println(requestURI);
System.out.println(requestURL);
//6.获取协议版本:HTTP/1.1
String protocol = request.getProtocol();
System.out.println(protocol);
//7.获取客户机ip
String remoteAddr = request.getRemoteAddr();
System.out.println(remoteAddr);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
6.2.3 获取请求头数据:
String referer = request.getHeader("referer");
System.out.println(referer);
//2.防盗链
if( referer!= null){
if(referer.contains("/Servlet")){
System.out.println("通过");
}else System.out.println("禁止");
}
七.通用请求方式
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;
@WebServlet(name = "Servlet", value = "/Servlet")
public class Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.根据参数名获取参数值
String username = request.getParameter("username");
//2.根据参数名获取参数值的数组
String[] hobbies = request.getParameterValues("hobby");
for(String hobby:hobbies){
System.out.println(hobby);
};
//3.获取所有请求的参数名称
Enumeration parameterNames = request.getParameterNames();
while(parameterNames.hasMoreElements()){
String s = parameterNames.nextElement();
System.out.println(s);
}
//4.获取所有参数的map集合
Map parameterMap = request.getParameterMap();
Set keySet = parameterMap.keySet();
for (String name:keySet){
String[] values = parameterMap.get(name);
System.out.println(name);
for (String value:values){
System.out.println(value);
}
System.out.println("");
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
}



