Servlet 运⾏在服务端的Java⼩程序,是sun公司提供⼀套规范(接⼝),⽤来处理客户端请求、响应给浏览器的动态资源。但servlet的实质就是java代码,通过java的API动态的向客户端输出内容。
servlet规范:包含三个技术点
1.Http请求 request
请求行: GET /day02_war_exploded/index.html HTTP/1.1
GET: 请求方式[method] GET POST PUT DELETE
POST: 只有在Form表单method=post时候
特点: 参数隐藏, 请求体中
参数大小没有限制, 可以是文件
GET: 直接访问, 超链接, method=get等
特点: 参数是添加在url后面 ? 连接
参数大小有限制
/day02_war_exploded/index.html: 资源地址URI
HTTP/1.1: 协议和版本
请求头: map, 客户端的基本信息
请求体: post请求方式提交的参数
Http响应 response
响应行: HTTP/1.1 200
HTTP/1.1: 协议和版本
200: 状态码 正常 [status]
304: 访问缓存
404: 资源未找到
500: 服务器端代码(java代码)异常
302: 重定向
响应头: map, 服务器端封装的数据
响应体: 服务器响应内容
一个页面[html代码]
一个文件
一些数据…
描述整一个过程
<servlet>
<servlet-name>自定义名字
<servlet-class>全限定类名
servlet>
<servlet-mapping>
<servlet-name>上面的名字[自定义名字]
<url-pattern>/地址[自定义地址]
servlet-mapping>
<servlet>
<servlet-name>Talonservlet-name>
<servlet-class>a_servlet01.HelloTalonservlet-class>
servlet>
<servlet-mapping>
<servlet-name>Talonservlet-name>
<url-pattern>/hellourl-pattern>
servlet-mapping>
<servlet>
<servlet-name>Demo01servlet-name>
<servlet-class>a_servlet01.HelloDemo01servlet-class>
servlet>
<servlet-mapping>
<servlet-name>Demo01servlet-name>
<url-pattern>/demo01url-pattern>
<url-pattern>/DEMO01url-pattern>
<url-pattern>/hello/demo01url-pattern>
servlet-mapping>
<servlet>
<servlet-name>Demo02servlet-name>
<servlet-class>a_servlet01.HelloDemo02servlet-class>
servlet>
<servlet-mapping>
<servlet-name>Demo02servlet-name>
<url-pattern>/hello/*url-pattern>
servlet-mapping>
<servlet>
<servlet-name>Demo03servlet-name>
<servlet-class>a_servlet01.HelloDemo03servlet-class>
servlet>
<servlet-mapping>
<servlet-name>Demo03servlet-name>
<url-pattern>*.userurl-pattern>
servlet-mapping>
注解: @xx @interface
注解属性: 类型 属性名() [default]
1.属性没有设定默认值时, 必须传参
2.只有当传入的属性只有一个, 并且属性名是value的时候, 属性名可以省略
3.属性类型是数组时, 又只有一个值, 可以不用{}
注解不是可以加在任意位置的, 注解是可以解析的 -> 反射
注解作用: 可以取代xml配置文件
JavaEE 从 3.0 开始支持注解
public class ServletDemo01 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
//1.获得当前这个Servlet名字 servlet-name
String servletName = servletConfig.getServletName();
System.out.println(servletName);
//2.获得servlet的初始化参数
String initParameter = servletConfig.getInitParameter("encoding");
System.out.println(initParameter);
//获得所有初始化的名字
Enumeration<String> names = servletConfig.getInitParameterNames();
while (names.hasMoreElements()){
String s = names.nextElement();
String initParameter1 = servletConfig.getInitParameter(s);
System.out.println(initParameter1);
}
//3.获得servletContext对象
ServletContext servletContext = servletConfig.getServletContext();
System.out.println(servletContext);
}
ServletContext代表是⼀个web应⽤的环境(上下⽂)对象ServletContext对象内部封装是该web应⽤的信息,ServletContext对象⼀个web应⽤只有⼀个。
ServletContext对象的⽣命周期?
<context-param>
<param-name>driverparam-name>
<param-value>com.mysql.cj.jdbc.Driverparam-value>
context-param>
ServletContext application = servletRequest.getServletContext();
//1.获得应用的路径(名字)
String path = application.getContextPath();
System.out.println(path);
//2.获得应用的初始化参数 - web.xml
String configPath = application.getInitParameter("driver");
System.out.println(configPath);
//3.获得应用中资源的绝对路径 必须掌握
// src/a.txt
String aPath = application.getRealPath("WEB-INF/classes/a.txt");
// web/b.txt
String bPath = application.getRealPath("b.txt");
// web/WEB-INF/c.txt
String cPath = application.getRealPath("WEB-INF/c.txt");
// day02工程/d.txt
System.out.println(aPath);
System.out.println(bPath);
System.out.println(cPath);
这个是获取页面
package c_servletContext;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.util.Date;
@WebServlet("/servletContext/demo02")
public class servletContextDemo02 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
ServletContext context = servletRequest.getServletContext();
context.setAttribute("date",new Date());
Object num = context.getAttribute("read");
if (num== null){
context.setAttribute("read",1);
}else {
Integer n = (Integer)num;
context.setAttribute("read",n+1);
}
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
这个是响应情况页面
package c_servletContext;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.util.Date;
@WebServlet(value = "/servletContext/demo03")
public class servletContextDemo03 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
ServletContext context = servletRequest.getServletContext();
Object date = context.getAttribute("date");
System.out.println(date);
System.out.println(context.getAttribute("read"));
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}