Struts2工作原理和核心组件
一、Struts2的工作原理
Struts2 中是使用拦截器来处理用户请求的,使得用户的业务控制器Action和Servlet分离。
一个客户的请求在Struts2框架中处理的过程大体有以下4步:
(1)客户提交请求到服务器。
(2)请求被提交到一系列的过滤器或者拦截器中,最后到达FilterDispatcher(Struts2中MVC的控制器部分)。
(3)FilterDispatcher读取配置文件中struts.xml,根据配置信息调用某个Action来处理客户的请求。
(4)Antion处理之后,返回处理的结果,FilterDispatcher根据struts.xml的配置信息找到对应的页面跳转。
如上图所示,用户提交请求后经过多个拦截器拦截后交给核心控制器FilterDispatcher处理。核心控制器读取struts.xml配置文件,根据配置文件的信息指定某一个业务控制器Action来处理用户的数据。action调用某些业务组件进行处理,在处理过程在还可以调用其他模型的组件共同完成数据的处理。action处理完成后返回给FilterDispatcher一个处理结果,FilterDispatcher根据返回的处理结果再读取struts.xml配置文件,根据配置文件中的信息决定下一步跳转到哪个jsp页面或者调用哪一个action。
二、Struts2的核心组件
1、控制器组件
在基于MVC的应用程序开发中,控制器组件的主要功能是从客户端接收数据、调用模型(JavaBean)进行数据处理以及返回给客户某个视图。
(1)FilterDispatcher控制器
FilterDispatcher是一个过滤器,是struts2核心控制器,控制着整个Java Web 项目中数据的流向和操作。FilterDispatcher需要在web.xml文件中进行配置。
(2)struts.xml配置文件
struts.xml是struts2的核心配置文件。在控制器中起着关键作用。
(3)Action控制器
Action是struts2的业务控制器,可以不实现任何接口或者继承struts2的任何类。Action类是一个基本的Java类,具有可重用性。Action不实现任何业务逻辑,只负责组织调用业务模型组件。
2、模型组件
模型组件是可以实现业务逻辑的模块,如JavaBean、POJO。Struts2的业务控制器不会对用户的请求做出实质的处理,用户的请求最终由模型组件负责处理,业务控制器只是提供处理的场所。
3、视图组件
Struts2的视图组件包括HTML,JSP,Struts2标签和FreeMarker等视图技术。
使用eclipse开发的基于Struts2的登录系统
实现截图:
登录:
成功:
导入的struts2包:
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<filter>
<!-- 配置Struts2核心控制器的名称 -->
<filter-name>struts2</filter-name>
<!-- 配置Struts2核心控制器的类 -->
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<!-- 配置Struts2控制器的名称 -->
<filter-name>struts2</filter-name>
<!-- 配置所有url请求 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
<session-config>
<!-- 指定默认的会话超时时间间隔,以分钟为单位 -->
<session-timeout>
30
</session-timeout>
</session-config>
<!-- 配置默认的访问界面 -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- 所有的anction都要放在package下,name属性定义包名,extends属性定义继承的包空间struts-default -->
<package name="default" extends="struts-default">
<!-- 可以有多对action;name对业务控制器命名,与表单中的action指定的名字相同;class指定该action的action类 -->
<action name="login" class="action.LoginAction">
<!-- 定义两个逻辑视图和物理视图资源之间的映射,name值是action返回的结果,即逻辑视图 -->
<result name="success">/success.jsp</result>
<result name="error">/login.jsp</result>
</action>
</package>
</struts>
登录页面的业务逻辑组件LoginBean类
package bean;
public class LoginBean {
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;
}
//处理用户登录的方法login()
public boolean login(String username,String password) {
boolean isLogin=false;
if("123".equals(username) && "123".equals(password)) {
isLogin=true;
return isLogin;
}else {
isLogin=false;
return isLogin;
}
}
}
login.jsp对应的业务控制器LoginAction类
package action;
import com.opensymphony.xwork2.ActionSupport;
import bean.LoginBean;
public class LoginAction extends ActionSupport {
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;
}
public String execute() throws Exception{
LoginBean lBean=new LoginBean();
if (lBean.login(username, password)) {
return SUCCESS;
}else {
return ERROR;
}
}
}
login.jsp和success.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>登录</title>
</head>
<body>
<hr>
<!-- action属性的login是连接业务控制器指定的名字,login必须与struts.xml中的一致 -->
<form action="login" method="post">
用户名:<input name="username" type="text"><br>
密 码:<input name="password" type="password"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>登录成功</title>
</head>
<body>
<h1>登录成功!</h1>
</body>
</html>