struts工作流程分析

2008.11.23 / 标签: ,,, / 分类: J2EE技术

技术关键在于学习其原理,而不是浅浅淡淡的会用,免得别人问起的时候什么也不知道,尤其是在面试时!
首先页面上的数据请求被发送到服务器,此时的请求先进入到前端控制器(ActionServlet)。ActionServlet再将请求转发给后端控制器(Action),在转发中顺便送了一份礼物form(ActionForm),在Action中对form中的数据做实际的处理操作并返回一份礼物forward(ActionForward)给ActionServlet,ActionServlet收到这份礼物后根据其中的关键字从struts配置文件Struts-config.xml中获取具体的跳转页。
那么ActionServlet是怎么知道该找哪个后端控制器呢?又是怎么知道返回的ActionForward具体是什么呢?为了回答这个问题,我们参考一个用Struts做的登陆程序。

登陆表单代码:

 
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  3. <html>
  4.   <head>
  5.     <title>struts工作流程分析</title>
  6.   </head> 
  7.   <body>
  8.     <form action="login.do" method="POST">
  9.         用户名:<input type="text" name="userName"><br/>
  10.         密码:<input type="password" name="userPwd"><br/>
  11.         <input type="submit" value="登录">
  12.     </form>
  13.   </body>
  14. </html>

 

LoginAction代码:

 
  1. package cn.ineeke.action;
  2.  
  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.http.HttpServletResponse;
  5.  
  6. import org.apache.struts.action.Action;
  7. import org.apache.struts.action.ActionForm;
  8. import org.apache.struts.action.ActionForward;
  9. import org.apache.struts.action.ActionMapping;
  10.  
  11. import cn.ineeke.form.LoginForm;
  12. /**
  13.  *作者:Neeke
  14.  *BLOG:http://www.ineeke.com
  15.  */
  16. public class LoginAction extends Action {
  17.  
  18.     @Override
  19.     public ActionForward execute(ActionMapping mapping, ActionForm form,
  20.             HttpServletRequest request, HttpServletResponse response)
  21.             throws Exception {
  22.             LoginForm loginForm = (LoginForm)form;
  23.             String forwardName = "failure";
  24.             if(loginForm.getUserName().equals("neeke") && loginForm.getUserPwd().equals("123456")){
  25.                 forwardName = "success";
  26.             }
  27.             return mapping.findForward(forwardName);
  28.     }
  29.  
  30. }

LoginForm代码:

 
  1. package cn.ineeke.form;
  2.  
  3. import org.apache.struts.action.ActionForm;
  4.  
  5. public class LoginForm extends ActionForm {
  6.     private String userName = null;
  7.     private String userPwd = null;
  8.     public String getUserName() {
  9.         return userName;
  10.     }
  11.     public void setUserName(String userName) {
  12.         this.userName = userName;
  13.     }
  14.     public String getUserPwd() {
  15.         return userPwd;
  16.     }
  17.     public void setUserPwd(String userPwd) {
  18.         this.userPwd = userPwd;
  19.     }
  20. }

 

Struts-config.xml文件:

 
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd">
  3.  
  4. <struts-config>
  5.   <form-beans>
  6.     <form-bean name="loginForm" type="cn.ineeke.form.LoginForm"></form-bean>
  7.   </form-beans>
  8.   <action-mappings>
  9.     <action path="/login" type="cn.ineeke.action.LoginAction" name="loginForm">
  10.         <forward name="success" path="/success.jsp"></forward>
  11.         <forward name="failure" path="/failure.jsp"></forward>
  12.     </action>
  13.   </action-mappings>
  14.   <message-resources parameter="cn.ineeke.struts.ApplicationResources" />
  15. </struts-config>
  16.  

当我们的表单提交给login.do的时候,ActionServlet就会去读取Struts-config.xml文件并根据<action path="/login" type="cn.ineeke.action.LoginAction" name="loginForm">中的type属性找到具体的后端控制器LoginAction,与此同时又根据name属性找到<form-bean name="loginForm" type="cn.ineeke.form.LoginForm"></form-bean>并将表单中的数据存储在LoginForm的实例中(这个实例就是前端控制器送给后端控制器的礼物了),在LoginAction的execute方法中进行数据处理并返回一个ActionForward对象(回赠一份礼物)给ActionServlet。最后ActionServlet再根据这份礼物的关键字在
<forward name="success" path="/success.jsp"></forward>
<forward name="failure" path="/failure.jsp"></forward>
中进行查找,并跳转到相应的path。

Servlet上下文

2008.04.11 / 标签: , / 分类: J2EE技术
Sofa

Servlet上下文

Servlet上下文提供对应用程序中所有Servlet所共有的各种资源和功能的访问。Servlet上下文API用于设置应用程序中所有Servlet共有的信息。Servlet可能需要共享他们之间的共有信息。运行于同一服务器的Servlet有时会共享资源,如JSP页面、文件和其他Servlet

javax.servlet.ServletContext接口中用于处理上下文属性的方法如下。

getAttribute():返回Servlet上下文中对应属性名称的对象。Servlet容器使用getAttribute()方法提供有关Servlet的附加信息。

getAttribute()的语法为:

public Object getAttribute(String name)

其中,nameServlet的属性名称。

setAttribute():将对象绑定到Servlet上下文中提供的属性名称。如果指定的名称已经使用,则方法setAttribute()将该属性值替换为新的属性值。setAttribute()的语法为:

public void setAttribute(String name,Object object)。

Servlet通过ServletConfig对象获得对其ServletContext对象的引用。

 

Servlet通信方法

2008.04.10 / 标签: / 分类: J2EE技术
Sofa

Servlet通信方法

Servlet间通信的3种基本需求为,访问当前从Servlet加载的Servlet,使用其他的Servlet功能执行一项任务和共享Servlet之间的状态信息。

Servlet有时需要访问网络资源(如其他ServletJSP页面)以满足客户端需求。这些资源可以为其他ServletJSP页面。Servlet API通过将对象与给出的客户会话关联来执行会话管理。Servlet运行于一个称为ServletContext的环境,该环境描述了与Servlet关联的各种参数。一个Servlet只属于一个ServletConext

属于同一个应用程序的Servlet可以使用javax.servlet.RequestDispatcher接口的forwardinclude方法来共享数据。forward方法将HTTP请求从一个Servlet发送到其他Servlet。该请求包含传递到目标Servlet的URL和请求参数。include方法可以接收Servlet以包括Servlet响应中的其他Servlet响应数据。接收客户端可以访问接收对象,但是只能将数据写入到response对象。

doPost()

2008.04.01 / 标签: , / 分类: J2EE技术
Sofa

doPost()

doPost():由服务器调用以允许Servlet处理客户端发出的POST请求。通过GenericServlet类service()方法来调用此方法。HTTP POST方法用于通过Internet发送大量数据。提交响应之前,Servlet容器要编写标题,这是因为在HTTP中必须在发送实际响应之前发送标题。如果HTTP POST请求的格式不正确,则doPost()方法会返回HTTP“请求错误”的消息。doPost()方法的语法为:

public void doPost(HttpServletReqest req, HttpServletResponse res) throws ServletException,IOException

其中,req是存储客户端请求的HttpServletRequest对象;res是包含服务器对客户端作出响应的HttpServletResponse对象。

无觅相关文章插件,快速提升流量