本篇博客以登录实例,来看struts架构的实现思路。
1.登录的jsp页面
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>Insert title here</title>
</head>
<body>
<form action="login.do" method="post">
姓名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
说明:form表单中,根据action的值,在struts-config.xml文件中会找到<path="/action">的<action-mapping>标签。根据这个标签,找得到对应的action类。这里是LoginAction类
2.loginActionForm类,负责收集实体信息
package com.bjpowernode.struts;
import org.apache.struts.action.ActionForm;
/**
* 登录ActionForm,负责收集表单数据
* 表单的属性必须和LoginActionForm中get、set的属性一致
* @author xj
*
*/
@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;
}
}
说明:
这个类继承自struts架构中的ActionForm类。需要注意,类中的set方法名称中的变量名,小写首字母需要和JSP页面里提交的form表单中标签的名一致。例如:getPassword中的password对应,form表单中name属性为password的标签
3.Action类,取得表单信息,调用业务逻辑,返回转向信息
package com.bjpowernode.struts;
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;
/**
* 登录Action
* 负责取得表单数据,调用业务逻辑,返回转向信息
* @author xj
*
*/
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();
if("admin".equals(username)&&"admin".equals(password)){
return mapping.findForward("success");
}else{
return mapping.findForward("error");
}*/
LoginActionForm laf = (LoginActionForm)form;
String username = laf.getUsername();
String password = laf.getPassword();
UserManager userManager = new UserManager();
try{
//调用相应的业务逻辑处理类
userManager.login(username, password);
//跳转到登录成功页面
return mapping.findForward("success");
//用自己封装的异常类捕获异常——用户不能找到
}catch(UserNotFoundException e){
e.printStackTrace();
//将错误信息存放到request中
request.setAttribute("msg", "用户不能找到,用户名称=【" + username +"】");
//用自己封装的异常类捕获异常——密码错误
}catch(PasswordErrorException e){
//将错误信息放到request中
request.setAttribute("msg", "密码错误!");
}
//跳转到错误页面
return mapping.findForward("error");
}
}
说明:这个类继承Struts框架中的Action类,实现了execute方法.参数form存放了提交表单的信息。request存放了用户的请求信息。在Action中对用户请求进行业务处理,调用Model访问数据库,将操作数据库的结果信息放到request中。最后返回要跳转到的JSP页面。将页面展示给用户。
4.配置文件
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
<form-beans>
<form-bean name="loginForm" type="com.bjpowernode.struts.LoginActionForm"></form-bean>
</form-beans>
<action-mappings>
<action path="/login"
type="com.bjpowernode.struts.LoginAction"
name="loginForm"
scope="request"
>
<forward name="success" path="/login_success.jsp"></forward>
<forward name="error" path="/login_error.jsp"></forward>
</action>
</action-mappings>
</struts-config>
说明:
在配置文件中,标签<form-beans>包含所有的Form类。这里是LoginActionForm类。
在<action-mappings>中配置了。用户请求地址和Action类对应关系,以及Action类和ActionForm类的对应关系。
分析业务流转:用户输入用户名,密码提交表单。通过分析请求地址找到对应的action。此例中为loginAction。并将提交的表单信息,放到与loginAction匹配的LoginActionForm中。在Action中执行execute方法,进行业务处理。
5.实现效果
登录页面输入用户名和密码,登录成功则跳转到登录成功页面,否则跳转到登录失败页面。登录失败时通过异常类捕获了异常,提示相应的错误。
6.总结:
通过这个实例很清楚的了解了strust1的执行流程。