Ø
将
servlet
和
JSP
结合使用,可以把应用程序的逻辑和外观呈现部分清楚的分开。
Ø
servlet API
由两个程序包组成
ª
javax.servlet
ª
javax.servlet.http
Ø
servlet
的实质是实现了借口
javax.servlet.Servlet
的类
Ø
web
容器管理
servlet
生命周期的所有方面,它根据需要创建
servlet
类的实例,将请求传
递给实例进行处理,最终删除实例。
Ø
容器会在
servlet
生命周期的适当时间调用下列方法
ª
public void init() throws ServletException
在发送第一个请求之前调用一次。
ª
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException,IOException
反复调用以使
servlet
处理
GET
请求。
ª
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException,IOException
反复调用以使
servlet
处理
POST
请求。
ª
public void destroy()
在
servlet
停止服务前调用一次。
ª
容器只为每个
servlet
创建一个实例,这意味着
servlet
必须是线程安全的,即,能够同时
处理多个请求,每个处理都通过
servlet
代码作为单独的线程来处理。
Ø
编译和安装
servlet
ª
要编译
servlet
,首先必须确保
servlet.jar
文件在
CLASSPATH
中
ª
编译完后,将类文件放在
WEB-INF/classes
目录中(容器自动在
WEB-INF/classes
目
录中查找类);也可以用程序包形式出现,此时目录结构为
WEB-INF/classes/com/mycompany
;还可以将类打包到一个
JAR
文件中,拷贝到
WEB-INF/lib
目录中。
ª
测试
http://localhost:8080/servlet/com.mycompany.HelloWorld
Ø
将
servlet
作为所有应用程序请求的公共入口点时,可以获得对应用程序页面流的整体控
制。
Ø
当使用
servlet
作为控制器时,必须处理下列基本要求
ª
所有请求处理都必须传递到单独的控制器
servlet
中。
ª
servlet
必须能够区分请求,以便进行不同类型的处理。
ª
可以使用现成的
struts servlet
ª
struts servlet
根据请求
URI
中的一部分来断定请求的类型,查找对应的行为类(使用
配制信息),并调用
execute()
方法。
ª
execute()
方法不显示应答,只关心商务逻辑。该方法返回一个
struts ActionForward
实
例,其中包含应答应该调用以显示应答的
JSP
页面的相关信息。该页面由逻辑名称
进行标示,并影射到配置文件中的实际页面逻辑上。因此可以通过重新配置,而不
是改变代码,从而至少在某种程度上控制页面流。
Ø
使用
servlet
的最佳解决方案是定义
servlet
的映射规则
而不是使用:
/myapp/servlet
开头的调用
或是使用
<form action=”/ora/servlet/controller/someAction”>
以上方式的调用
servlet
将会导致安全问题和程序部署的问题。
Ø
struts
中
ª
配置描述符中映射规则确保了所有请求都可以到达
struts servlet
ª
struts-config.xml
中的行为映射提供了区分不同请求时所需的信息。
ª
最后则有实现一些老式的编码并实现行为类。
ª
struts Action
中的
execute()
方法执行请求处理,
execute()
方法返回后,
struts servlet
调
用指定的资源,一般情况下是
JSP
页面,内容是针对该请求的应答。
ª
ActionMapping
类封装了所有可以在
Struts
配置文件中定义的映射信息。里面完成逻
辑页面名称和实际页面名称之间的映射。可以同
<forward>
元素设置这些映射
可以用如下方法取得
ActionForward
的实例:
ActionForward nextPage=(ActionMapping)mapping.findForward(“main”);
nextPage = new ActionForward(next,true);
ActionForward
构造函数中的第
2
个参数:
True:
使用重定向
False:
使用转发
ª
<global-forwards>
定义可以用于所有行为的映射,而
<action>
中的
<forward>
则定义了
仅可用于该行为的映射。
ª
当
struts servlet
收到一个请求时,首先使用
processPath()
方法来提取映射到行为类的
部分,然后查处匹配行为类的实例,并调用
execute()
方法。
ª
execute()
方法返回的
ActionForward
实例由
prcessActionForward()
方法处理。该方法实
现了如何转发控制。
ª
ActionForward
包含了
struts
将控制传递给下一个组件时需要的所有信息。
ª
servlet
重定向
API
:
response.sendRedirect(response.encodeRedirectURL(path));
ª
servlet
转发
API: RequestDispatcher rd = getSevletContext().getRequestDispatcher(path);
rd.forward(request,response);
此行为与
<jsp:forward>
行为相同,永久的奖控制传递个目标。
ª
它还包括另一个
include()
方法:该方法相同与
<jsp:include>
行为:临时将控制传
递给目标,生产一部分应答,但是不设置应答首部。
ª
encodeRedirectURL(path) API
:如果浏览器不支持
cookie
,该方法将在
URL
中插入会
话
ID
。
Ø
所有请求处理都必须传递到单独的控制器
servlet
中
web
应用程序的配置描述符中可以定义
3
种映射规则:
ª
完全匹配:是
URI
匹配与该
URI
完全相同的模式路径,
例:请求
/contextPath/exactMatch
与模式
/exactMatch
向匹配
ª
路径前缀匹配规则:使
URI
匹配与该
URI
一样具有最多路径元素的模式路径
例:
/contextPath/pathPrefix
和
//contextPath/pathPrefix/pathInfo
都与模式
/pathPrefix/*
匹配
ª
扩展名匹配规则:使
URI
匹配与该
URI
具有相同扩展名的扩展模式
例:
/contextPath/name.extension
和
/contextPath/aPath/name.extension
都与
*.extension
匹配
ª
web
容器以“完全匹配”、“路径前缀规则”、“扩展名规则”的顺序查找匹配项。
ª
“完全匹配”规则很少使用,
struts servlet
只使用“路径前缀匹配规则”和“扩展名
匹配规则”
例:
<wep-app>
...
...
<servlet>
<servlet-name>
action
</servlet-name>
<servlet-calss>
org.apache.struts.action.ActionServlet
</servlet-calss>
</servlet>
<servlet-mapping>
<servlet-name>
action
</servlet-name>
<url-patterb>
*.do
</url-pattern>
</servlet-mapping>
...
...
</wep-app>
此时匹配<form action=
”
someAction.do
”
>
ª
也可以使用
路径前缀匹配规则
<servlet-mapping>
<servlet-name>
action
</servlet-name>
<url-patterb>
/ch18/do/*
</url-pattern>
</servlet-mapping>
此时匹配
/ch18/do
ª
在这里容器会为所有以
.do
结尾的请求调用
struts servlet
Ø
servlet
必须能够区分请求,以便进行不同类型的处理
ª
Struts sevlet
使用配置文件(
sruts-config.xml
),将具体请求映射到具体的行为类上来
完成该任务。
ª
/ora/ch18/protected/do/storeMsg
使用路径前缀匹配规则,经过
struts processPath API
处理后为
/storeMsg
这样处理会有安全问题,所以应该坚持使用扩展名匹配规则
ª
/ora/ch18/protected/storeMsg.do
使用扩展名匹配规则,经过
struts processPath API
处理后为
/ch18/protected/storeMsg
ª
cookies
中
setMaxAge
(
maxAge
)
,
如果
maxAge-=0
则告诉浏览器删除
cookie
ª
servlet
规范将保存
throwable
对象的请求属性命名为
Javax.servlet.error.exception
ª
JSP
规范将保存
throwable
对象的请求属性命名为
Javax.servlet.jsp.jspException