1、介绍
- 什么是servlet
servlet是javaEE规范之一,规范就是接口 - servlet就是javaweb三大组件之一
三大组件分别是:Servlet程序,Filter过滤器,listener监听器 - Servlet是运行在服务器上的一个java小程序,它可以接收客户端发过来的请求,并响应数据给客户端
2、Servlet的使用
2.1、手动实现Servlet程序
- 编写一个类去实现Servlet接口
- 实现service方法处理请求,并响应数据
- 到web.xml中去配置servlet程序的访问地址
<?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_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>servletTest</servlet-name>
<servlet-class>servlet.servletTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servletTest</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
</web-app>
url-pattern如何定位到Servlet程序访问
2.2、Servlet的生命周期
- 执行Servlet构造器方法,只执行一次
- 执行init初始化方法,只执行一次
- 执行service方法,每次访问都被调用
- 执行destory方法,停止才会被执行
2.3、Servlet请求的分发处理
请求一般都是从表单中发出的,所以以表单为例,请求类型有get/post两种类型。
<body>
<form action="http://localhost:8080/javaweb0/test" method="get"></form>
</body>
重写servlet中的service方法获取请求类型。
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
HttpServletRequest httpServletRequest=(HttpServletRequest) servletRequest;
String method = httpServletRequest.getMethod();
}
2.4、通过继承HttpServlet实现Servlet程序
一般在实际项目开发中,都是使用继承HttpServlet的方式实现Servlet程序进行开发
- 填写一个类去继承HttpServlet类
- 根据业务需要重写doGet或doPost方法
- 到web.xml中配置Servlet程序的访问地址
public class servletTest0 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
2.4.1、HttpServlet类
2.4.2、ServletConfig类
sevletConfig类是servlet程序的配置信息类 servlet程序和servletConfig对象是由Tomcat负责创建,我们负责使用 servlet程序默认是第一次访问的时候创建,servletConfig是每个servlet程序创建时,就创建一个对应的 servletConfig对象。
作用
- 可以获取Servlet程序的别名servlet-name的值
- 获取初始化参数init-param
- 获取ServletContext对象
@Override
public class servletTest0 extends HttpServlet {
public void init(ServletConfig config) throws ServletException {
System.out.println("servletTest0的别名是:"+config.getServletName());
System.out.println("初始化参数username的值:"+config.getInitParameter("user"));
System.out.println("servletContext对象为:"+config.getServletContext());
}
public void init(ServletConfig config) throws ServletException {
super.init(config)
}
}
<servlet>
<servlet-name>servletTest0</servlet-name>
<servlet-class>servlet.servletTest0</servlet-class>
<init-param>
<param-name>user</param-name>
<param-value>root</param-value>
</init-param>
</servlet>
2.4.2、ServletContext类
- ServletContext是一个接口,他表示servlet上下文对象
- 一个web工程只有一个ServletContext对象实例
- ServletContext是一个域对象
什么是域对象:是可以像map一样存取数据的对象,这里的域值得是存取数据的操作范围。 存数据:setAttribute() 取数据:getAttribute() 删除数据:removeAttribute()
作用
- 获取web.xml中配置的上下文参数context.param
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = getServletConfig().getServletContext();
String username = context.getInitParameter("username");
System.out.println("context中的username是:"+username);
}
<context-param>
<param-name>username</param-name>
<param-value>dcd</param-value>
</context-param>
- 获取当前的工程路径,格式:/工程路径
System.out.println("当前工程路径:"+context.getContextPath());
- 获取工程部署后在服务器硬盘上的绝对路径
System.out.println("工程部署后在硬盘上的绝对路径"+context.getRealPath("/"));
“/” 表示映射到IDEA上的工程 http://ip:port/工程名/ 就是web目录
- 像map一样存储数据
web工程开始的时候设置,直到工程销毁的时候才没有的,context是相对于整个工程的文本。
2.4.3、HttpServletRequest类
每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的HTTP协议信息解析好封装到Request对象中,然后传递到service方法(doGet和doPost)中给我们使用,我们可以通过HttpServletRequet对象,获取到所有请求的信息。
常用API
1、getRequestURI() 获取请求的资源路径 2、getRequestURL() 获取请求的统一资源定位符(绝对路径) 3、getRemoteHost() 获取客户端的IP地址 4、getHeader() 获取请求头 5、getParameter() 获取请求的参数 6、getParameterValues() 获取请求的参数(多个值的时候使用) 7、getMethod():获取请求的方式(GET,POST) 8、setAttribute(key,value) 设置域数据 9、getAttribute(key) 获得域数据 10、getRequestDispatcher() 获取请求转发对象
getParameter的使用
public class servletTest0 extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
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, IOException {
req.setCharacterEncoding("utf-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobbies = req.getParameterValues("hobby");
System.out.println(username+" "+password+" "+ Arrays.asList(hobbies));
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>这是一个表单</title>
</head>
<body>
<form action="http://localhost:8080/javaweb0/test0" method="get">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td>爱好:</td>
<td>
<input type="checkbox" name="hobby" value="cpp">cpp
<input type="checkbox" name="hobby" value="java">java
<input type="checkbox" name="hobby" value="py">py
</td>
</tr>
<tr>
<td><input type="submit"></td>
</tr>
</table>
</form>
</body>
</html>
请求的转发
什么是请求的转发? 是指服务器收到请求后,从一个资源,跳到另一个资源的操作叫做请求的转发。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
System.out.println("在柜台一中查看参数"+username);
req.setAttribute("key","柜台一的章子");
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/test");
requestDispatcher.forward(req,resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
System.out.println("在柜台2查看参数"+username);
Object key = req.getAttribute("key");
System.out.println("柜台1的章子:"+key);
System.out.println("柜台2处理自己的业务");
}
2.4.4、HttpServletResponse类
- 两个输出流
字节流:getOutputStream() 常用于下载(传递二进制数据) 字符流:getWrite() 常用于回传字符串 两个流同时只能使用一个
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("UTF-8");
resp.setHeader("Content-Type","text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.write("收到啦!!");
}
请求重定向
指客户端给服务器发请求,然后服务器告诉客户端给他另一个新地址去访问,因为之前的地址可能已经被废弃。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.write("内容已经搬迁了");
resp.setStatus(302);
resp.setHeader("location","http://localhost:8080/javaweb0/test");
}
|