下面用一个简单的login例子来简单的演示一下struts的流程
1 开发form
要接受浏览器传来的参数,就要对新建一个form类,这个类需要继承自org.apache.struts.action.ActionForm,form中的字段要和浏览器表单的字段名匹配(实际上是set/get属性名),这里假设前台表单传回username和password2个参数。
package com.element;
import org.apache.struts.action.ActionForm;
public class LoginForm extends ActionForm {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
在struts-config.xml中注册刚新建的form类
<?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-bean都要嵌套在form-beans标签中 name属性是一个逻辑名,代表了这个formbean,可以随意取名,但不能和其它formbean重名 type属性指明了formbean的类路径 --> <form-beans> <form-bean name="loginForm" type="com.element.LoginForm"></form-bean> </form-beans> </struts-config>
2 开发Action
这个Action类要继承org.apache.struts.action.Action,在struts框架里面的作用是后端控制器。这里需要覆写execute()方法
package com.element;
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;
public class LoginAction extends Action {
//必须覆写execute方法
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
return super.execute(mapping, form, request, response);
}
}
同时也需要在struts-config.xml中配置Action类:
<?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-bean都要嵌套在form-beans标签中 name属性是一个逻辑名,代表了这个formbean,可以随意取名,但不能和其它formbean重名 type属性指明了formbean的类路径 --> <form-beans> <form-bean name="loginForm" type="com.element.LoginForm"></form-bean> </form-beans> <!--同理,action元素需要嵌套在action-mappings标签中 一个Action类由一个<action>表示 path属性表示该Action要拦截的url,path="/login"就代表了login.do,/代表的应用根目录,不是站点根目录 type属性指明了Action类的路径 name属性和form-bean中的name属性相匹配,指明需要填充该formbean来给Action处理 <forward>子标签指定了Action处理完后的视图,其中需要在Action.execute中指明name属性的值,从而将请求转发到path属性指定的路径中 --> <action-mappings> <action path="/login" type="com.element.LoginAction" name="loginForm"> <forward name="loginSuccess" path="/loginSuccess.jsp"></forward> <forward name="loginFailure" path="/loginFailure.jsp"></forward> </action> </action-mappings> </struts-config>
3 开发execute方法
在execute方法中相当于是一个控制器,需要在其中进行业务层的调用和视图层的返回
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
//需要将form转型成真正的类型,这样才可以取得浏览器的参数信息
LoginForm lf = (LoginForm)form;
if(lf.getUsername().equals("element")){
//参数和在<forward>标签中的name相对应
return mapping.findForward("loginSuccess");
}else
return mapping.findForward("loginFailure");
}
4 建立login.jsp,loginSuccess.jsp,loginFailure.jsp
其中login.jsp的body代码如下:
<body>
<!-- action要求以.do结尾,这样才能被ActionServlet截获 -->
<form action="<%=request.getContextPath()%>/login.do">
username:<input name="username" type="text"/><br/>
password:<input name="password" type="password"/><br/>
<input type="submit" value="登陆">
</form>
</body>
将项目部署,运行的时候,当在表单控件中的username=“element”的时候,页面就转发到loginSuccess.jsp,否则到loginFailure.jsp.
注:即使不输入username控件,也会转发到loginFailure.jsp,因为struts会讲formbean中的username设置为“”空字符串,因此不会抛出null指针异常。