提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
Servlet
一、什么是Servlet
-
Servlet是JavaWeb最为核心的内容,它是Java提供的一门动态web资源开发技术。
-
使用Servlet就可以实现,根据不同的登录用户在页面上动态显示不同内容。
-
Servlet是JavaEE规范之一,其实就是一个接口,将来我们需要定义Servlet类实现Servlet接口,并由web服务器运行Servlet
简单理解就是连接前段与java代码的技术
1.1 Servlet的主要方法
初始化方法,在Servlet被创建时执行,只执行一次
void init(ServletConfig config)
提供服务方法, 每次Servlet被访问,都会调用该方法
void service(ServletRequest req, ServletResponse res)
销毁方法,当Servlet被销毁时,调用该方法。在内存释放或服务器关闭时销毁Servlet
void destroy()
1.2 Servlet的访问路径二种方式
Servlet类编写好后,要想被访问到,就需要配置其访问路径
pom.xml导入servlet的坐标依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<!--
此处为什么需要添加该标签?
provided指的是在编译和测试过程中有效,最后生成的war包时不会加入
因为Tomcat的lib目录中已经有servlet-api这个jar包,如果在生成war包的时候生效就会和Tomcat中的jar包冲突,导致报错
-->
<scope>provided</scope>
</dependency>
1.2.1 注释配置访问路径
@WebServlet(“路径”)
将注释加在继承HttpServlet的类上面
@WebServlet("/login")
public class TestHttpServlet extends HttpServlet {}
1.2.2 web.xml配置访问路径
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>com.yyy.servlet.TestServlet</servlet-class><!--这里放的是继承HttpServlet的类全包名-->
</servlet>
<servlet-mapping><!--servlet映射-->
<servlet-name>test</servlet-name><!--Servlet标签起的名字-->
<url-pattern>/test</url-pattern><!--这个地方就是要配置的访问路径-->
</servlet-mapping>
注释是在Servlet3.0之后开始有的,相比这二种,大部分我们接触的还是注释的方式
二、request
request:获取请求数据
- 浏览器会发送HTTP请求到后台服务器[Tomcat]
- HTTP的请求中会包含很多请求数据[请求行+请求头+请求体]
- 后台服务器[Tomcat]会对HTTP请求中的数据进行解析并把解析结果存入到一个对象中
- 所存入的对象即为request对象,所以我们可以从request对象中获取请求的相关参数
- 获取到数据后就可以继续后续的业务,比如获取用户名和密码就可以实现登录操作的相关业务
Request的继承体系:
2.1 Request获取数据
- 获取请求方式:
GET
String getMethod()
- 获取虚拟目录(项目访问路径):
/request-demo
String getContextPath()
- 获取URL(统一资源定位符):
http://localhost:8080/request-demo/req1
StringBuffer getRequestURL()
- 获取URI(统一资源标识符):
/request-demo/req1
String getRequestURI()
- 获取请求参数(GET方式):
username=zhangsan&password=123
String getQueryString()
- 请求行
- getMethod()获取请求方式
- getContextPath()获取项目访问路径
- getRequestURL()获取请求URL
- getRequestURI()获取请求URI
- getQueryString()获取GET请求方式的请求参数
- 请求头
- getHeader(String name)根据请求头名称获取其对应的值
- 请求体
- 注意: 浏览器发送的POST请求才有请求体
- 如果是纯文本数据:getReader()
- 如果是字节数据如文件数据:getInputStream()
2.2 获取请求参数的通用方式
- 获取所有参数Map集合
Map<String,String[]> getParameterMap()
- 根据名称获取参数值(数组)
String[] getParameterValues(String name)
- 根据名称获取参数值(单个值)
String getParameter(String name)
2.3 解决中文乱码问题
在servlet类中的前二行,定义以下代码
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
2.4 请求转发
1)浏览器发送请求给服务器,服务器中对应的资源A接收到请求
(2)资源A处理完请求后将请求发给资源B
(3)资源B处理完后将结果响应给浏览器
(4)请求从资源A到资源B的过程就叫请求转发
请求转发的实现代码:
request.getRequestDispatcher("资源B路径").forward(request,response);
2.5 请求转发资源间共享数据
使用request的方法:
void setAttribute(String name,Object o);
代码实现:
request.getRequestDispatcher("/allStudent.jsp").forward(request,response);
三、response
Response重定向(redirect):一种资源跳转方式。
(1)浏览器发送请求给服务器,服务器中对应的资源A接收到请求
(2)资源A现在无法处理该请求,就会给浏览器响应一个302的状态码+location的一个访问资源B的路径
(3)浏览器接收到响应状态码为302就会重新发送请求到location对应的访问地址去访问资源B
(4)资源B接收到请求后进行处理并最终给浏览器响应结果,这整个过程就叫重定向
实现方式:
response.setStatus(302);
response.setHeader("location","资源B的访问路径");
3.1 重定向的特点
浏览器地址栏路径发送变化
-
当进行重定向访问的时候,由于是由浏览器发送的两次请求,所以地址会发生变化
-
可以重定向到任何位置的资源(服务内容、外部均可)
(请求转发只能访问服务器内的资源)
因为第一次响应结果中包含了浏览器下次要跳转的路径,所以这个路径是可以任意位置资源。 -
两次请求,不能在多个资源使用request共享数据
-
因为浏览器发送了两次请求,是两个不同的request对象,就无法通过request对象进行共享数据