上篇博客由Servlet的几个版本的例子,引出在页面跳转控制方面要解决的问题,在文章最后提到了Struts1,这篇文章目的是解释一下什么是Struts1,及如何使用的问题。
什么是Struts1
说一下我的理解:它符合MVC思想,使用Java二次开发封装的一个框架,主要简化、解决页面请求分发、跳转的问题。Stuts1的优点是使用了丰富的配置文件使得灵活性大大提高;因为已经封装成框架,使得缩短了开发时间、提高了开发效率,同时适量使用抽象,使得代码冗余减低、文件冗余减少,维护更加简单。
Struts1各个部件的相互作用如下:
它是一个开源项目,我们可以深入到框架的源码中,进一步理解Struts1并学习其开发、封装的思想,非常利于编程能力的提升。
登录实例
首先来看一下一个完整的struts1的登录实例,通过这个实例中涉及到的Struts1组成,来解释这些组成,并说明Struts1执行的流程。
文件树
login.jsp
<form action="login.do" method="post">
用户:<input type="text" name="username" /><br/>
密码:<input type="text" name="password" /><br/>
<input type="submit" value="提交"/>
</form>
LoginActionForm
package com.tgb.struts1;
import org.apache.struts.action.ActionForm;
/*****
* 收集表单数据
* 表单属性值必须和get/set相对应
* @author Administrator
*
*/
@SuppressWarnings("serial")
public class LoginActionForm 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;
}
}
LoginAction
package com.tgb.struts1;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.swing.ActionMap;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
/****
* 调用业务逻辑,返回转向信息
* @author Administrator
*
*/
public class LoginAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response) throws Exception
{
LoginActionForm laf=(LoginActionForm)form;
String username=laf.getUsername();
String password=laf.getPassword();
UserManager userManager=new UserManager();
try {
userManager.login(username, password);
} catch (UserNotFoundException e) {
e.printStackTrace();
request.setAttribute("msg", "用户名未找到"+username);
} catch(PasswordWrongException e)
{
e.printStackTrace();
request.setAttribute("msg", "密码错误");
}
return mapping.findForward("success");
}
}
UserManager
package com.tgb.struts1;
/*****
* 逻辑处理,此处以简答的admin验证为例
* @author lidab_000
*
*/
public class UserManager {
public void login(String username,String password)
{
if (!"admin".equals(username)) {
throw new UserNotFoundException();
}
if (!"admin".equals(password)) {
throw new PasswordWrongException();
}
}
}
配置文件
web.xml
<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>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>2</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<!-- Standard Action Servlet Mapping -->
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
struts-config.xml
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
<struts-config>
<form-beans>
<form-bean name="loginForm" type="com.tgb.struts1.LoginActionForm" />
</form-beans>
<action-mappings>
<action path="/login" type="com.tgb.struts1.LoginAction" name="loginForm" scope="request">
<forward name="success" path="/login_success.jsp"/>
<forward name="error" path="/login_error.jsp" />
</action>
</action-mappings>
</struts-config>
运行结果
如果输入的都是admin,则显示登录成功:
流程分析
使用时序图分析流程如下:
我来解释一下这个流程:
- 用户输入用户名、密码后提交请求
- Tomcat得到请求,根据读取的web.xml,判断是否为struts指定的类型(*.do)
- 如果是struts指定类型,则将请求转到指定的类文件(ActionServlet.java)
- ActionServlet截取请求的url,匹配struts-config文件中的form和action类(LoginActionForm.java和LoginAction.java)
- 将提交的表单数据放入form中(LoginActionForm)
- 执行指定的Action(LoginAction),获取跳转信息(login_success.jsp)
- ActionServlet执行跳转
- 渲染页面,展现给用户
这仅仅是从宏观上struts的执行流程,这仅仅是外在的表现,其内在如何执行?下篇博客带你走进struts1框架代码中,请看《预加载ActinoServlet》。
更多相关博客,请至《层层递进Struts1(八)之总结》。