Servlet的运行环境
首先,它是java,设置 Java 开发工具包(Java Development Kit)
它跑在服务器上,设置 Web 服务器:Tomcat
Servlet的配置
访问Servlet之前,必须配置Servlet,否则不同的请求,如何对应不同的Servlet来进行处理呢?
在web.xml中配置
Servlet的主要配置信息,示例如下:
<servlet>
<!-- 自定义的名字,在web.xml中不重复 --->
<servlet-name>MyServlet</servlet-name>
<!-- Servlet类的完整名字 -->
<servlet-class>j2ee.servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<!-- 与之前自定义的名字相对应 -->
<servlet-name>MyServlet</servlet-name>
<!-- 自定义的逻辑地址,必须以/开头 -->
<url-pattern>/doServlet</url-pattern>
</servlet-mapping>
这里重点说明一下url-pattern,自定义的逻辑地址,也就是说如果访问的url中,根路径之后符合自定义的逻辑要求,则跳转到对应的Servlet,如上/doServlet,意味着如果我的url是诸如 http://localhost:8080/doServlet,那么访问会跳转到 j2ee.servlet.MyServlet 类中去,根据GET或POST调用相应的doGet或doPost方法。
其中,自定义的逻辑地址,有以下几种
配置读解与注意事项【注意】
① 上面的两个必须相同====这个名字,是容器中唯一存在的,是容器中的某个Servlet的标识
② 后面指在对应的类上面【一定是类全名,因为类一般在包里面,要带上包名】.技巧:你可以直接在你的servlet类中复制过来,这样可以避免出错!
③ 必须是/servlet 再加servlet名字.大家现在就这么记.
匹配方式
完全匹配
如/doServlet
即如 http://localhost:8080/doServlet 才能访问, …/doServlet.do 或 …/doServlet/xxx 等都无法访问到该Servlet
路径匹配
如/*
即根路径下所有请求都会访问到对应Servlet
扩展名匹配
如.do 以 .do 结尾的请求
如.html 以 .html 结尾的请求
请求、会话、上下文属性比较
在HttpServletRequest、HttpSession、ServletContext中有三个相同的方法,都与属性有关:
public Object getAttribute(String name);
public void setAttribute(String name, Object o);
public void removeAttribute(String name);
对这三者而言,实际上就是作用域不同的问题,范围从小到大分别是:Request < Session < ServletContext
请求属性
请求对象的生命周期较短,每个线程访问Web组件,都会创建一个新的请求,只有请求转发时才将请求转发到下一个资源。
所以请求属性不会长期驻留在容器内存中,也不会带来并发访问的问题,能够使用请求属性完成相关功能时,尽量使用请求属性。
会话属性
会话对象在一次会话过程中是一个唯一的对象,生命周期比请求要长。
建议在Web应用中,只有当某些对象必须在会话范围内共享,必须使用会话属性时,才考虑使用会话属性。
上下文属性
上下文对象随容器启动而创建,只有容器关闭时才销毁,所以生命周期长,而且一个应用只有一个上下文对象。
所以,不要轻易使用上下文属性,只有当确定某对象必须在上下文范围内共享时,才考虑使用。
作用域就可以理解为:
请求:HTTP请求开始到结束这段时间
会话:HTTP会话开始到结束这段时间
上下文:服务器启动到停止这段时间
如果你只有request,想获取ServletContext,那么可以有:
request.getSession().getServletContext()
实际上,这种方式也常在涉及文件存放时获取项目的物理路径,如:
String path = request.getSession().getServletContext().getRealPath("/WEB-INF/temp/image/") + fileName;
提到request对象获取数据
request.getAttribute()方法
request请求中还有一个getParameter()方法,两者还是稍有区别的:
- getParameter()是获取POST/GET传递的参数值,是String类型,它从客户端到服务器
- getAttribute()则是获取对象容器中的数据,是Object类型,只是在Web容器内部传递
- getParameter()中的参数,在请求转发不会丢失,仍可在新的Servlet中获取到,而重定向方式则会丢失