技术关键在于学习其原理,而不是浅浅淡淡的会用,免得别人问起的时候什么也不知道,尤其是在面试时!
首先页面上的数据请求被发送到服务器,此时的请求先进入到前端控制器(ActionServlet)。ActionServlet再将请求转发给后端控制器(Action),在转发中顺便送了一份礼物form(ActionForm),在Action中对form中的数据做实际的处理操作并返回一份礼物forward(ActionForward)给ActionServlet,ActionServlet收到这份礼物后根据其中的关键字从struts配置文件Struts-config.xml中获取具体的跳转页。
那么ActionServlet是怎么知道该找哪个后端控制器呢?又是怎么知道返回的ActionForward具体是什么呢?为了回答这个问题,我们参考一个用Struts做的登陆程序。
登陆表单代码:
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>struts工作流程分析</title>
- </head>
- <body>
- <form action="login.do" method="POST">
- 用户名:<input type="text" name="userName"><br/>
- 密码:<input type="password" name="userPwd"><br/>
- <input type="submit" value="登录">
- </form>
- </body>
- </html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>struts工作流程分析</title> </head> <body> <form action="login.do" method="POST"> 用户名:<input type="text" name="userName"><br/> 密码:<input type="password" name="userPwd"><br/> <input type="submit" value="登录"> </form> </body></html>
LoginAction代码:
- package cn.ineeke.action;
-
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
-
- import org.apache.struts.action.Action;
- import org.apache.struts.action.ActionForm;
- import org.apache.struts.action.ActionForward;
- import org.apache.struts.action.ActionMapping;
-
- import cn.ineeke.form.LoginForm;
- *作者:Neeke
- *BLOG:http://www.ineeke.com
- */
- public class LoginAction extends Action {
-
- @Override
- public ActionForward execute(ActionMapping mapping, ActionForm form,
- HttpServletRequest request, HttpServletResponse response)
- throws Exception {
- LoginForm loginForm = (LoginForm)form;
- String forwardName = "failure";
- if(loginForm.getUserName().equals("neeke") && loginForm.getUserPwd().equals("123456")){
- forwardName = "success";
- }
- return mapping.findForward(forwardName);
- }
-
- }
package cn.ineeke.action;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.struts.action.Action;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionForward;import org.apache.struts.action.ActionMapping;import cn.ineeke.form.LoginForm;/** *作者:Neeke *BLOG:http://www.ineeke.com */public class LoginAction extends Action { @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { LoginForm loginFor
m = (LoginForm)form; String forwardName = "failure"; if(loginForm.getUserName().equals("neeke") && loginForm.getUserPwd().equals("123456")){ forwardName = "success"; } return mapping.findForward(forwardName); }}
LoginForm代码:
- package cn.ineeke.form;
-
- import org.apache.struts.action.ActionForm;
-
- public class LoginForm extends ActionForm {
- private String userName = null;
- private String userPwd = null;
- public String getUserName() {
- return userName;
- }
- public void setUserName(String userName) {
- this.userName = userName;
- }
- public String getUserPwd() {
- return userPwd;
- }
- public void setUserPwd(String userPwd) {
- this.userPwd = userPwd;
- }
- }
package cn.ineeke.form;import org.apache.struts.action.ActionForm;public class LoginForm extends ActionForm { private String userName = null; private String userPwd = null; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getUserPwd() { return userPwd; } public void setUserPwd(String userPwd) { this.userPwd = userPwd; }}
Struts-config.xml文件:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd">
-
- <struts-config>
- <form-beans>
- <form-bean name="loginForm" type="cn.ineeke.form.LoginForm"></form-bean>
- </form-beans>
- <action-mappings>
- <action path="/login" type="cn.ineeke.action.LoginAction" name="loginForm">
- <forward name="success" path="/success.jsp"></forward>
- <forward name="failure" path="/failure.jsp"></forward>
- </action>
- </action-mappings>
- <message-resources parameter="cn.ineeke.struts.ApplicationResources" />
- </struts-config>
-
<?xml version="1.
0" encoding="UTF-8"?><!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd"><struts-config> <form-beans> <form-bean name="loginForm" type="cn.ineeke.form.LoginForm"></form-bean> </form-beans> <action-mappings> <action path="/login" type="cn.ineeke.action.LoginAction" name="loginForm"> <forward name="success" path="/success.jsp"></forward> <forward name="failure" path="/failure.jsp"></forward> </action> </action-mappings> <message-resources parameter="cn.ineeke.struts.ApplicationResources" /></struts-config>
当我们的表单提交给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。
2008.04.11 / 标签:
Servlet,
Servlet上下文 / 分类:
J2EE技术
Servlet上下文
Servlet上下文提供对应用程序中所有Servlet所共有的各种资源和功能的访问。Servlet上下文API用于设置应用程序中所有Servlet共有的信息。Servlet可能需要共享他们之间的共有信息。运行于同一服务器的Servlet有时会共享资源,如JSP页面、文件和其他Servlet。
javax.servlet.ServletContext接口中用于处理上下文属性的方法如下。
getAttribute():返回Servlet上下文中对应属性名称的对象。Servlet容器使用getAttribute()方法提供有关Servlet的附加信息。
getAttribute()的语法为:
public Object getAttribute(String name)
其中,name是Servlet的属性名称。
setAttribute():将对象绑定到Servlet上下文中提供的属性名称。如果指定的名称已经使用,则方法setAttribute()将该属性值替换为新的属性值。setAttribute()的语法为:
public void setAttribute(String name,Object object)。
Servlet通过ServletConfig对象获得对其ServletContext对象的引用。
2008.04.10 / 标签:
Servlet / 分类:
J2EE技术
Servlet通信方法
Servlet间通信的3种基本需求为,访问当前从Servlet加载的Servlet,使用其他的Servlet功能执行一项任务和共享Servlet之间的状态信息。
Servlet有时需要访问网络资源(如其他Servlet和JSP页面)以满足客户端需求。这些资源可以为其他Servlet、JSP页面。Servlet API通过将对象与给出的客户会话关联来执行会话管理。Servlet运行于一个称为ServletContext的环境,该环境描述了与Servlet关联的各种参数。一个Servlet只属于一个ServletConext。
属于同一个应用程序的Servlet可以使用javax.servlet.RequestDispatcher接口的forward和include方法来共享数据。forward方法将HTTP请求从一个Servlet发送到其他Servlet。该请求包含传递到目标Servlet的URL和请求参数。include方法可以接收Servlet以包括Servlet响应中的其他Servlet响应数据。接收客户端可以访问接收对象,但是只能将数据写入到response对象。
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对象。