MVC解释:
M:Model,由ActionForm和JavaBean组成,ActionForm封装请求参数,所有请求参数封装成ActionForm对象,该对象由ActionServlet转发给Action。而javabean则封装了底层的业务逻辑
V:View,视图,指jsp,html,Velocity模板或Excel 等
C:Control,指servlet控制器,struts的Controller由两部分组成:
系统核心控制器(对应ActionServlet)和业务逻辑控制器(对应Action部分),其中ActionServlet由struts提供,继承了HttpServlet,因此需要位置,负责拦截所有Htttp请求,若需要调用业务逻辑逻辑器,转发给Action,否则,转向JSP页面

MVC流程图如下:

mvc网络架构图 mvc框架图_html

MVC特点:
1.一个模型对应多个视图,减少代码量,易于维护
2.模型返回数据与显示逻辑分离,降低了模块之间的耦合性

struts2创建web应用程序:
要求:
1.Servlet API2.4或更高版本
2.JSP 2.0或更高版本
3.Java 7或更高版本
4.tomcat8或更高版本

搭建过程:

1.使用eclipse先创建maven应用程序:

mvc网络架构图 mvc框架图_mvc网络架构图_02


点击next完成创建

2.eclipse添加tomcat:
参考:
https://www.baidu.com/link?url=xX2IB8AESQcQ6HovygDL67ToVuZxrToNtRT0RPhHulilTrRy3zRhZ99-s0PWeQigviYk7DwEh2oW78Et-M_v-K&wd=&eqid=a6945119000a490d000000065d070e40

3.pom文件添加版本变量和依赖:

<properties>
    <struts2.version>2.5.17</struts2.version>
  </properties>

<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-core</artifactId>
    <version>${struts2.version}</version>
 </dependency>

4.在src/main/resources下添加log4j2.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <Console name="STDOUT" target="SYSTEM_OUT">
            <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="com.opensymphony.xwork2" level="debug"/>
        <Logger name="org.apache.struts2" level="debug"/>
        <Root level="warn">
            <AppenderRef ref="STDOUT"/>
        </Root>
    </Loggers>
</Configuration>

在pom文件添加版本变量和依赖:

<properties>
    <log4j2.version>2.11.2</log4j2.version>
 </properties>
 
 <dependency>
 <groupId>org.apache.logging.log4j</groupId>
 <artifactId>log4j-core</artifactId>
 <version>${log4j2.version}</version>
 </dependency>
 <dependency>
 <groupId>org.apache.logging.log4j</groupId>
 <artifactId>log4j-api</artifactId>
 <version>${log4j2.version}</version>
  </dependency>

5.添加struts2 Servlet过滤器
要让Struts2框架能够与web应用程序一起使用,需要添加Servlet过滤器和过滤映射web.xml,web.xml在src/main/webapp/WEB-INF文件夹下配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
	xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	<display-name>Basic Struts2</display-name>
	<welcome-file-list>
		<welcome-file>index</welcome-file>
	</welcome-file-list>
	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>

6.创建struts.xml
struts可以使用xml配置文件或注释指定URL,Java类或者视图之间的关系,文件名是struts.xml,在src/main/resources下,struts.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
    <constant name="struts.devMode" value="true" />
    <package name="ssh" extends="struts-default">
        <action name="index">
            <result>/index.jsp</result>
        </action>
    </package>
</struts>

如果URL结束,index.action将浏览器重定向到index.jsp

7.构建并运行应用程序:
右键项目->Run As->Run on Server,tomcat启动完成后
输入http://localhost:8080/ssh/index.action,显示如图:

mvc网络架构图 mvc框架图_struts_03

应用程序启动了,好了,接下来我们就可以更加详细介绍struts的应用:

struts工作原理:
当在struts web应用中单击超链接或者提交HTML表单时,并不会发送到另一个服务器页面,而是发送到提供的Java类,这些java类称为Actions,触发Action后,Result会选择一个资源呈现相应,这些可以是jsp页面,pdf文件,Excel表格或者java小程序窗口,以最简单的hello world为例,工作流程为:
1.创建一个类来存储欢迎消息(模型)
2.创建服务器页面显示消息(视图)
3.创建Action类(控制器)控制用户、模型和视图之间的交互
4.创建一个mapping(struts.xml)来耦合Action类和视图
创建流程为:
1.在src/main/java下创建模型类MessageStore.java

//模型层
public class MessageStore {
	private String message;
	public MessageStore(){
		this.message="Hello Struts User";
	}
	public String getMessage(){
		return this.message;
	}
}

2.创建Action控制器类

//控制层
public class HelloWorldAction extends ActionSupport{
	//使用组合模式声明MessageStore模型
	private MessageStore messageStore;
	//创建MessageStore模型实例
	public String execute(){
		messageStore=new MessageStore();
		return SUCCESS;
	}
	//返回模型实例
	public MessageStore getMessageStore(){
		return messageStore;
	}
}

struts框架将创建HelloWorldAction 类的对象并调用excute()方法响应用户的url超链接,

3.在src/main/webapp下创建helloWorld.jsp

<!DOCTYPE html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!--taglib指令告诉servlet容器该页面使用struts2标签,标签前有s-->
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Hello World!</title>
  </head>
  <body>
  <!--s:property标签显示通过helloWorldAction控制器方法getMessageStore返回的值
      该方法返回一个MessageStore对象,通过.message获得值作为value属性  -->
    <h2><s:property value="messageStore.message" /></h2>
  </body>
</html>

4.在struts.xml中添加Struts配置

<struts>
    <constant name="struts.devMode" value="true" />
    <package name="ssh" extends="struts-default">
        <action name="index">
            <result>/index.jsp</result>
        </action>
        
        <action name="hello" class="action.HelloWorldAction" method="execute">
        <result name="success">/helloWorld.jsp</result>
        </action>
    </package>
</struts>

该映射将HelloWorldAction 类(控制器)和HelloWorld.jsp (视图)绑定在一起,映射告诉Struts2框架哪个类将响应用户操作,该类哪个方法将被执行,以及该方法返回的String结果呈现什么视图

5.创建URL操作,修改index.jsp为:

<!DOCTYPE html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Basic Struts 2 Application - Welcome</title>
    </head>
    <body>
        <h1>Welcome To Struts 2!</h1>
        <p><a href="<s:url action='hello'/>">Hello World</a></p>
    </body>
</html>

6.构建并运行应用程序:

右键项目->Run As->Run on Server,tomcat启动完成后

输入http://localhost:8080/ssh/index.action,显示如图:

mvc网络架构图 mvc框架图_struts_04


点击紫色hello world,图片显示为:

mvc网络架构图 mvc框架图_html_05


至此:

归纳下struts如何运行的:

1.浏览器向Web服务器发送URL http:// localhost:8080 / helloworld / hello.action的请求

2.容器从Web服务器接收资源请求hello.action,根据web.mxl加载设置,容器中所有请求被org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter拦截

3.StrutsPrepareAndExecuteFilter过滤器查找名为"hello"的动作映射,发现该映射对应类 HelloWorldAction,实例化该类并调用excute方法

4.excute方法返回字符串success,然后查找该字符串对应的加载页面为helloWorld.jsp

5.解析helloWorld.jsp,其中<s:property value=“messageStore.message” />标记调用Action 的getter getMessageStore,将调用getMessageStore返回的对象,在调用message属性合并到helloWorld.jsp中

6.将响应浏览器的helloWorld.jsp发送回浏览器