分类: Java
2008-10-30 20:19:43
public class HibernatePlugIn implements PlugIn{
private String configFile;
// This method will be called at application shutdown time
public void destroy() {
System.out.println("Entering HibernatePlugIn.destroy()");
//Put hibernate cleanup code here
System.out.println("Exiting HibernatePlugIn.destroy()");
}
//This method will be called at application startup time
public void init(ActionServlet actionServlet, ModuleConfig config)
throws ServletException {
System.out.println("Entering HibernatePlugIn.init()");
System.out.println("Value of init parameter " +
getConfigFile());
System.out.println("Exiting HibernatePlugIn.init()");
}
public String getConfigFile() {
return name;
}
public void setConfigFile(String string) {
configFile = string;
}
}
...
"sample1.resources.ApplicationResources"/>
value="/hibernate.cfg.xml"/>
|
1、processMultipart(): 在这个方法中,Struts读取request以找出contentType是否为multipart/form-data。假如是,则解析并将其打包成一个实现HttpServletRequest的包。当你成生一个放置数据的HTML FORM时,request的contentType默认是application/x-www-form-urlencoded。但是如果你的form 的input类型是FILE-type允许用户上载文件,那么你必须把form的contentType改为multipart/form-data。如这样做,你永远不能通过HttpServletRequest的getParameter()来读取用户提交的form值;你必须以 InputStream的形式读取request,然后解析它得到值。
2、processPath(): 在这个方法中,Struts将读取request的URI以判断用来得到ActionMapping元素的路径。
3、processLocale(): 在这个方法中,Struts将得到当前request的Locale;Locale假如被配置,将作为 org.apache.struts.action.LOCALE属性的值被存入HttpSession。这个方法的附作用是HttpSession会被创建。假如你不想此事发生,可将在struts-config.xml 文件里ControllerConfig的local属性设置为false,如下:
4、processContent():通过调用response.setContentType()设置response的contentType。这个方法首先会试着的得到配置在struts-config.xml里的contentType。默认为text/html,重写方法如下:
5、processNoCache():Struts将为每个response的设置以下三个header,假如已在struts 的config.xml将配置为no-cache。
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 1);
假如你想设置为no-cache header,在struts-config.xml中加如以下几行
6、processPreprocess():这是一个一般意义的预处理hook,其可被子类重写。在RequestProcessor里的实现什么都没有做,总是返回true。如此方法返回false会中断请求处理。
7、processMapping():这个方法会利用path信息找到ActionMapping对象。ActionMapping对象在struts-config.xml file文件里表示为
name="newContactForm" scope="request">
ActionMapping元素包含了如Action类的名称及在请求中用到的ActionForm的信息,另外还有配置在当前ActionMapping的里的ActionForwards信息。
8、processRoles(): Struts的web 应用安全提供了一个认证机制。这就是说,一旦用户登录到容器,Struts的processRoles()方法通过调用request.isUserInRole()可以检查他是否有权限执行给定的ActionMapping。
假如你有一个AddUserAction,限制只有administrator权限的用户才能新添加用户。你所要做的就是在AddUserAction 的action元素里添加一个值为administrator的role属性。
9、processActionForm():每个ActionMapping都有一个与它关联的ActionForm类。struts在处理ActionMapping时,他会从
type="org.apache.struts.action.DynaActionForm"> type="java.lang.String"/> type="java.lang.String"/>
在这个例子里,首先会检查org.apache.struts.action.DynaActionForm类的对象是否在request 范围内。如是,则使用它,否则创建一个新的对象并在request范围内设置它。
10、processPopulate()::在这个方法里,Struts将匹配的request parameters值填入ActionForm类的实例变量中。
11、processValidate():Struts将调用ActionForm的validate()方法。假如validate()返回ActionErrors,Struts将用户转到由
12、processForward() and processInclude():在这两个方法里,Struts检查
你可以从他们的名字看出其不同之处。processForward()调用RequestDispatcher.forward(),, processInclude()调用RequestDispatcher.include()。假如你同时配置了orward 和include 属性,Struts总会调用forward,因为forward,是首先被处理的。
13、processActionCreate():这个方法从
14、processActionPerform():这个方法调用Action 类的execute()方法,其中有你写入的业务逻辑。
15、processForwardConfig():Action类的execute()将会返回一个ActionForward类型的对象,指出哪一页面将展示给用户。因此Struts将为这个页面创建RequestDispatchet,然后再调用RequestDispatcher.forward()方法。
以上列出的方法解释了RequestProcessor在请求处理的每步默认实现及各个步骤执行的顺序。正如你所见,RequestProcessor很有弹性,它允许你通过设置
创建你自己的RequestProcessor
从以上内容我们已经明白了RequestProcessor的默认实现是怎样工作的,现在我将通过创建你自己的RequestProcessor.展示一个怎样自定义RequestProcessor的例子。为了演示创建一个自定义RequestProcessor,我将修改例子实现以下连个业务需求:
我们要创建一个ContactImageAction类,它将生成images而不是一般的HTMl页面
在处理这个请求之前,将通过检查session里的userName属性来确认用户是否登录。假如此属性没有被找到,则将用户转到登录页面。
分两步来实现以上连个业务需求。
创建你自己的CustomRequestProcessor类,它将继承RequestProcessor类,如下:
public class CustomRequestProcessor
extends RequestProcessor {
protected boolean processPreprocess (
HttpServletRequest request,
HttpServletResponse response) {
HttpSession session = request.getSession(false);
//If user is trying to access login page
// then don't check
if( request.getServletPath().equals("/loginInput.do")
|| request.getServletPath().equals("/login.do") )
return true;
//Check if userName attribute is there is session.
//If so, it means user has allready logged in
if( session != null &&
session.getAttribute("userName") != null)
return true;
else{
try{
//If no redirect user to login Page
request.getRequestDispatcher
("/Login.jsp").forward(request,response);
}catch(Exception ex){
}
}
return false;
}
protected void processContent(HttpServletRequest request,
HttpServletResponse response) {
//Check if user is requesting ContactImageAction
// if yes then set image/gif as content type
if( request.getServletPath().equals("/contactimage.do")){
response.setContentType("image/gif");
return;
}
super.processContent(request, response);
}
}
在CustomRequestProcessor 类的processPreprocess方法里,检查session的userName属性,假如没有找到,将用户转到登录页面。
对于产生images作为ContactImageAction类的输出,必须要重写processContent方法。首先检查其request是否请求 /contactimage路径,如是则设置contentType为image/gif;否则为text/html。
加入以下几行代码到sruts-config.xml文件里的
value="com.sample.util.CustomRequestProcessor"/>
请注意,假如你只是很少生成contentType不是text/html输出的Action类,重写processContent()就没有问题。如不是这种情况,你必须创建一个Struts子系统来处理生成imageAction的请求并设置contentType为image/gif
Title框架使用自己的RequestProcessor来装饰Struts生成的输出。
ActionServlet
假如你仔细研究Struts web应用的web.xml文件,它看上去像这样:
action= org.apache.struts.action.ActionServlet
action *.do
这就是说,ActionServlet负责处理所有发向Struts的请求。你可以创建ActionServlet的一个子类,假如你想在应用启动和关闭时或每次请求时做某些事情。但是你必须在继承ActionServlet类前创建PlugIn 或 RequestProcessor。在Servlet 1.1前,Title框架是基于继承ActionServlet类来装饰一个生成的response。但从1.1开始,就使用 TilesRequestProcessor类。
结论
开发你自己的MVC模型是一个很大的决心——你必须考虑开发和维护代码的时间和资源。Struts是一个功能强大且稳定的框架,你可以修改它以使其满足你大部分的业务需求。
另一方面,也不要轻易地决定扩展Struts。假如你在RequestProcessor里放入一些低效率的代码,这些代码将在每次请求时执行并大大地降低整个应用的效率。当然总有创建你自己的MVC框架比扩展Struts更好的情况。
资源
下载本文源码:[]
Struts主页
"Jakarta Struts框架介绍"
"学习Jakarta Struts 1.1"
Sunil Pail已从事J2EE四年,现今与IBM实验室合作