本例先讲解struts1的工作流程,然后举一个用户登录的例子做演示。
struts1的工作流程:
struts1是MVC模型的经典应用,以前对MVC的模型理解有错,一直以为C,也就是Control是做业务逻辑的,也就是业务逻辑都是由servlet做的,而JavaBean只起到一个模型的作用,但是到后来,听老师讲课才知道是我理解错了,也是老师之前给举的例子误导了我,到现在学习了struts1,才终于看透了Control的作用,也就是servlet仅仅是起到一个控制流程的作用,具体的后台的逻辑处理,是由Bean来做的。
在struts1中,servlet这个类已经不用我们动手去写了,别人已经给我们写好了,叫做ActionServlet,我们只需要导入ActionServlet所在的包就可以了。而我们所做的具体的控制工作,则相应的转换到一个配置文件——struts-config.xml 中。也就是我们要通过配置struts-config.xml文件,来起到控制的作用,就好像这个文件是servlet的接口。以前做控制的工作我们都是直接写servlet类的,现在我们做控制工作,是在struts-config.xml文件中。这点一定要绕过来,不然就不好理解struts1的工作流程了。
在struts1中,起M(Model)作用的是一个叫做ActionForm的类,也就是这个类充当了JavaBean的角色。
在struts1中,做业务处理的是一个叫做Action的类,其中有一个execute()方法,我们的逻辑处理都是在这个方法中做的,严格上来说这也是一个JavaBean。
另外,jsp页面,仍然起着V(View)的作用。
下面具体说一下struts-config.xml配置文件,因为这个是由以前我们写的MVC模型“升级”到struts1中,变化最大的地方。
它是怎么起控制作用的呢?其实这得从struts1的工作流程说起。
举登录的例子来说:
我们填写好用户名和密码的表单,会提交到ActionServlet中,ActionServlet会根据表单中的提交地址,也就是action所指定的参数,在struts-config.xml中查找对应的Action,从而调用Action做相应的业务处理,处理完后,Action会返回一个ActionForward对象到struts-config.xml中,指定处理结果的去向,这个去向可以是jsp页面,也可以是另一个Action。
也许你会疑惑,表单提交的时候,action不是只能指定一个提交地址吗?怎么会即提交到ActionServlet又指定某个Action呢?其实这里也是struts1的又一个特点。我们以前写的提交地址直接写servlet的url或是某个jsp的页面,但是在struts1中,这个提交地址会有些变化,习惯的,这个提交地址写成action="actionpath.do",点号前面指定的是某个具体的Action的path,也就是url,指明了这个表单想要由哪个Action来处理,点号后面加个do,是为了这个表单能够提交到ActionServlet,因为在web.xml中,ActionServlet的url-pattern写成了“*.do”。其实这里可以这样理解,就是ActionServlet起到一个过滤器的作用,捕捉所有url后缀有.do的页面。
下面就以一个简单的登录的例子,说明来看一下如何搭建struts1,并且理清一下struts1的工作流程:
1、新建一个web工程:struts1
2、在lib目录下导入所需的jar包,其中就包含上面提到的ActionServlet所在的包。(这些包当然要到Apache官网上去下载了,我用的版本是struts-1.3.10)
下载下来,解压缩,在apps目录下,有一个struts-blank-1.3.10.war文件,这是一个空的工程,也就是只搭建起来了struts1的框架,把这个文件用压缩软件打开,把struts-blank-1.3.10.war\WEB-INF\lib下的所有jar包复制到我们的工程的lib目录下。我们的ActionServlet类就在struts-core-1.3.10.jar这个包中。
3、导入包之后,我们来配置web.xml文件,也就是要注册ActionServlet类,添加如下代码:
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<load-on-startup>0</load-on-startup><!--在开启服务器的时候,加载这个类 -->
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern><!--这里的意思是过滤所有以.do做后缀的请求页面-->
</servlet-mapping>
4、创建ActionForm类:
package com.suo.ActionForm;
import org.apache.struts.action.ActionForm;
public class User 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;
}
}
User继承自ActionForm,其实就是一个JavaBean。
5、创建Action类:
package com.suo.Action;
import javax.servlet.http.*;
import org.apache.struts.action.*;
import com.suo.ActionForm.User;
public class Treate extends Action
{
public ActionForward execute(
ActionMapping mapping,//映射对象,封装了struts-config.xml与Action之间的映射关系
ActionForm form,//即表单对象,在ActionServlet中,会将用户提交的表单信息,自动封装成ActionForm对象。
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
User user=(User)form;//进行一下强制类型转换
if(user.getUserName().equals("suo") && user.getPassword().equals("123"))
{
return mapping.findForward("success");
}
else
return mapping.findForward("error");//返回ActionForward对象,指定用哪个页面或是Action处理结果
}
}
6、创建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="login" type="com.suo.ActionForm.User"></form-bean>
</form-beans>
<action-mappings>
<action name="login" path="/treate" type="com.suo.Action.Treate">
<forward name="error" path="/user/error.jsp"></forward>
<forward name="success" path="/user/success.jsp"></forward>
</action>
</action-mappings>
</struts-config>
有必要说一下配置文件中的对应关系:
<form-beans/>对应的是JavaBean,type指定的具体的类。
<action-mapping/>中的<action>对应的是某一个具体的Action,path指定访问这个Action时的路径,也就是url,type是指定这个Action的类文件。记住<forward>要写在<action>中。
<form-beans/>中某一个<form-bean/>的name要和其相对应的<action>的name一致。
至此,struts1环境就搭建好了!