一.概念
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet。
二.工作流程图
ActionServlet是struts中核心的控制器,所有的用户请求都必须通过ActionServlet的处理,而struts-config.xml是struts中核心的配置文件,在这个文件中配置了用户请求URL和控制器Action的映射关系,ActionServlet通过这个配置文件把用户的请求发送到对应的控制器中。
在struts web应用程序中,当web应用程序启动的时候,就会初始化ActionServlet在初始化ActionServlet的时候会加载struts-config.xml配置文件,在加载成功后会把这些URL和控制器映射关系存放在ActionMapping对象或者其他对象中。当ActionServlet接收到用户请求的时候,就会按照下面的流程对用户请求进行处理。
(1)ActionServlet接收到用户的请求后,会根据请求URL寻找匹配的ActionMapping对象,如果匹配失败,说明用户请求的URL路径信息有误,所以返回请求路径无效的信息,当找到匹配的ActionMapping的时候,进入到下一步。
(2)当ActionServlet找到匹配的ActionMapping对象的时候,会根据ActionMapping中的映射信息判断对应的ActionForm对象是否存在,如果不存在对应的ActionForm对象就创建一个新的ActionForm对应,并把用户提交的表单信息保存到这个ActionForm对象中。
(3)在struts-config.xml中这个配置文件,可以配置表单是否需要验证,如果需要验证,就调用ActionForm中的validate()方法对用户输入的表单进行验证。
(4)如果ActionForm的validate()方法返回了ActionErrors对象,则表明验证失败,ActionServlet把这个页面返回到用户输入的界面,提示用户重新输入。如果方法的返回值为null,就表明验证已经通过,可以进入下一步处理。
(5)ActionServlet可以根据ActionMapping对象查找用户请求转发给哪个控制器Action,如果对应的Action对象不存在,就创建这个对象,并调用这个Action的excute()方法。
(6)业务逻辑控制器Action的execute()方法就会返回一个ActionForward对象,ActionServlet把控制器处理的结果转发到ActionForward对象指定的JSP页面。
(7)ActionForward对象指定的JSP页面根据返回的处理结果,用合适形式把服务器处理的结果展示给用户,到这里为止,一个客户请求的整个过程完毕。
三.示例
1、 jar包拷贝
首先是建立java web项目,把jar包拷贝到项目lib文件夹下
2、 web.xml文件配置
将以下代码复制至项目的的WEB-INF下的web.xml中,主要是对struts自带的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>
<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>
3、创建接收请求参数的类
创建LoginActionForm.java文件,复制以下代码至文件中即可。此文件用于接收页面传入的参数值。
package com.bjpowernode.struts;
import org.apache.struts.action.ActionForm;
/**
* 登录ActionForm,负责表单收集数据.
* 表单的属性必须和ActionForm中的get和set的属性一致.
* @author
*
*/
public class LoginActionForm extends ActionForm {
//用户名。
private String username;
//密码。
private String password;
//设置密码。
public void setPassword(String password) {
this.password = password;
}
//得到用户名。
public String getUsername() {
return username;
}
//设置用户名。
public void setUsername(String username) {
this.username = username;
}
//得到密码。
public String getPassword() {
return password;
}
}
4、创建action,执行相应的处理
创建Action,获取参数值,进行相应的操作,跳转到相应的页面。
packagecom.bjpowernode.struts; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importorg.apache.struts.action.Action; importorg.apache.struts.action.ActionForm; importorg.apache.struts.action.ActionForward; importorg.apache.struts.action.ActionMapping; /** *登录Action *负责取得表单数据,调用业务逻辑,返回转向信息. * * @author * */ 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 = newUserManager(); //传递用户名和密码 try { userManager.login(username, password); request.setAttribute("username", username); return mapping.findForward("success"); }catch(UserNotFoundException e) { e.printStackTrace(); request.setAttribute("msg","用户不能找到,用户名称=[" +username +"+]"); }catch(PasswordErrorException e) { e.printStackTrace(); request.setAttribute("msg","密码错误"); } return mapping.findForward("error"); } }
5、创建struts2的配置文件struts-config.xml
在WEB-INF文件夹下创建struts-config.xml文件,复制以下代码至文件中
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration1.2//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
<struts-config>
<form-beans>
<form-bean name="loginForm" type="com.bjpowernode.struts.LoginActionForm"/>
</form-beans>
<action-mappings>
<action path="/login"
type="com.bjpowernode.struts.LoginAction"
name="loginForm"
scope="request"
>
<forward name="success" path="/login_success.jsp"/>
<forward name="error" path="/login_error.jsp"/>
</action>
</action-mappings>
</struts-config>
</xml>
Action-mappings元素用来包含零到多个action,其子元素action负责具体映射的详细信息。在action-mapping元素中可以定义0个或1个以上的action元素。每个action元素接受path属性定义的请求,并映射到type属性所定义的具体action对象。在映射过程中,将name属性定义的actionform一并传过去,它有如下属性:
Parameter,scope两个属性指定了传送方式和范围,scope常用的值有两个“session”和“request”。
Validate属性指定了是否需要actionform的验证。
Forward元素,将请求success转发到”/login_success.jsp”页面。
6、业务逻辑类UserManager和自定义异常类
代码如下所示:
packagecom.bjpowernode.struts;
public class UserManager {
public void login(String username,String password)
{
if(!"admin".equals(username))
{
throw new UserNotFoundException();
}
if(!"admin".equals(password))
{
throw new PasswordErrorException();
}
}
}
自定义异常类UserNotFoundException和PasswordErrorException代码如下所示。
packagecom.bjpowernode.struts;
public class UserNotFoundException extends RuntimeException {
public UserNotFoundException() {
}
public UserNotFoundException(Stringmessage) {
super(message);
}
public UserNotFoundException(Throwable cause) {
super(cause);
}
public UserNotFoundException(String message,Throwable cause) {
super(message, cause);
}
}
packagecom.bjpowernode.struts;
public class PasswordErrorException extends RuntimeException {
public PasswordErrorException() {
}
public PasswordErrorException(String message) {
super(message);
}
public PasswordErrorException(Throwable cause) {
super(cause);
}
public PasswordErrorException(String message,Throwable cause) {
super(message, cause);
}
}
7、视图jsp页面调用。
登录界面login.jsp,错误显示界面login_error.jsp,登录成功界面login_success.jsp。代码如下所示。
<%@pagelanguage="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<!DOCTYPEhtml PUBLIC "-//W3C//DTDHTML 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>Inserttitle here</title>
</head>
<body>
<form action="login.do" method="post">
用户:<inputtypeinputtype="text" name="username"><Br>
密码:<inputtypeinputtype="password" name="password"></br>
<input type="submit" value="登录">
</form>
</body>
</html>
Login_success.jsp.
<%@page language="java"contentType="text/html;charset=GB18030"
pageEncoding="GB18030"%>
<!DOCTYPE html PUBLIC "-//W3C//DTDHTML 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>
${username},登录成功!
</body>
</html>
Login_error.jsp界面。
<%@page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<!DOCTYPE html PUBLIC "-//W3C//DTDHTML 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>
<%--
<%=request.getAttribute("msg") %>
--%>
${msg }
</body>
</html>
至此实现了运用struts框架完成用户登录。
项目整体目录: