本以为不会再用到servlet和jsp了,也忘得差不多了,没想到最近的项目又遇到了T_T。没办法,只好把以前学过的这方面基础内容总结一下,方便日后查看。
1. 什么是Servlet?
sun公司制订的一种用来扩展web服务器功能的组件规范,用来处理动态资源的请求。servlet就是一个组件,需要部署到servlet容器(Tomcat)里面才能运行。
2.Servlet如何运行?
比如在浏览器地址栏输入http://127.0.0.1:8080/example/hello
step1.浏览器依据ip,port与tomcat建立连接。
step2.浏览器将请求数据打包并发送请求。即按照http协议的要求,创建请求数据包,并把该请求数据包发送给tomcat。
step3.tomcat收到请求数据包之后,按照http协议要求,解析请求数据包的内容,并且将解析到的数据存放到request对象里面,同时创建一个response对象。
step4.tomcat将servlet实例化,然后调用该实例的service方法。tomcat会将request对象和response对象作为参数传递给service方法。可以通过调用request对象提供的方法来获取请求数据包里面的数据,也可以将处理结果写入response对象。
step5.tomcat会从response对象中获取处理结果,然后打包发送给浏览器。
step6.浏览器解析响应数据包,生成页面。
3.如何写一个Servlet?
step1.写一个java类,实现Servlet接口或者继承HttpServlet抽象类。
step2.编译。
step3.打包。(变成一个组件)
appname (应用名)
WEB-INF
classes (放 .class文件)
lib (可选,放.jar文件)
web.xml (部署描述文件)
step4.部署。
将step3创建的整个文件夹拷贝到容器里面。可以使用jar命令将step3创建的整个文件夹压缩成".war"结尾的文件,然后再拷贝这个文件就可以了。
step5.启动servlet容器,访问servlet。 http://ip:port/appname/url-pattern.注:url-pattern在web.xml文件中设置。
4.读取请求参数值
1.String request.getParameter(String paramName); 如果请求参数名写错,返回null。
2.String[] request.getParameterValues(String paramName);有多个请求参数名相同时,用该方法。
5.容器如何处理请求资源路径?
比如,在浏览器地址输入 http://ip:port/hello/aaa.html
step1. 容器默认认为访问的是一个servlet,去查看web.xml,看是否有匹配的servlet。
注:有三种匹配方式
a. 精确匹配
<url-pattern>/aaa.html</url-pattern>
b. 通配符匹配
使用"*"来匹配零个或者多个任意的字符,比如
<url-pattern>/*</url-pattern>
<url-pattern>/demo/*</url-pattern>
c. 后缀匹配
使用"*."开头,后接一个任意的后缀,比如
<url-pattern>*.do</url-pattern>
以上配置会匹配所有以.do结尾的请求。
step2. 如果没有匹配的servlet,再去查找对应位置的文件。
让一个Servlet处理多种请求
step1. 该servlet采用后缀匹配。
<servlet-mapping>
<servlet-name>actionServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
step2.分析请求路径,依据分析结果,进行不同的处理。
2.1 获得请求资源路径
String uri = request.getRequestURI();
System.out.println("uri: " + uri);
2.2 为了方便比较,截取请求资源路径的一部分,
//我们把这一部分称之为请求路径
String path = uri.substring(uri.lastIndexOf("/"),uri.lastIndexOf("."));
System.out.println("path: " + path);
2.3 进行判断。依据请求路径,进行对应的处理
if("/list".equals(path)){
......
}else if("/add".equals(path)){
......
}
6.Servlet上下文
6.1什么是Servlet上下文?
容器启动之后,会为每一个web应用创建唯一的一个符合ServletContext接口要求的对象,该对象一般我们称之为servlet上下文。
唯一性:一个web应用对应一个上下文。
持久性:只要容器不关闭,应用没有被卸载,那么上下文就会一直存在。
6.2如何获得Servlet上下文?
GenericServlet提供了getServletContext()方法来获得上下文。
6.3作用
6.3.1)绑订数据
setAttribute
getAttribute
removeAttribute
注:
request,session,servlet上下文都提供了绑订数据相关的方法,如何选取?
a. 这三个对象,生存时间长度依次为request < session < servlet上下文,在满足使用条件的情况下,尽量优先使用生命周期短的。
b. 见下图
6.3.2)读取全局的初始化参数
a.什么是全局的初始化参数?
可以被同一个应用中的所有组件共享的初始化参数。
b.如何使用?
step1.配置
<!-- 配置全局的初始化参数 -->
<context-param>
<param-name>company</param-name>
<param-value>IBM</param-value>
</context-param>
step2.读取
ServletContext.getInitParameter(String paramName);
7.Servlet输出中文时产生的乱码问题
7.1为什么会有乱码?
out输出时,默认会使用iso-8859-1来编码。
7.2如何解决?
8.表单包含有中文参数值产生的乱码问题
8.1为什么会有乱码?
表单提交时,会对中文参数值进行编码,按照打开该表单所在的页面时的字符集来编码。比如,使用utf-8来编码;
而服务器端默认会使用iso-8859-1来解码,所以产生了乱码。
8.2如何解决?
8.2.1 post请求
8.2.2 get请求 修改server.xml