Struts2工作原理和核心组件

Struts2工作原理和核心组件

一、Struts2的工作原理

   Struts2 中是使用拦截器来处理用户请求的,使得用户的业务控制器Action和Servlet分离。
   一个客户的请求在Struts2框架中处理的过程大体有以下4步:
   (1)客户提交请求到服务器。
   (2)请求被提交到一系列的过滤器或者拦截器中,最后到达FilterDispatcher(Struts2中MVC的控制器部分)。
   (3)FilterDispatcher读取配置文件中struts.xml,根据配置信息调用某个Action来处理客户的请求。
   (4)Antion处理之后,返回处理的结果,FilterDispatcher根据struts.xml的配置信息找到对应的页面跳转。
struts2工作原理
   如上图所示,用户提交请求后经过多个拦截器拦截后交给核心控制器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>
密&nbsp;&nbsp;&nbsp;码:<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>

猜你喜欢

转载自blog.csdn.net/m0_37822234/article/details/78566744
今日推荐