Strusts2 MVC 架构
模型(Model) -视图(View) -控制器(Controller),通常简称MVC ,是一种开发web应用的程序的软件设计模式.该软件设计模式由以下三部分组成:
模型: - - 属于软件设计模式的底层基础,主要负责数据维护.它通过响应视图的请求和控制器的指令来更新自身的数据。
视图: - - 这部分是负责向用户呈现全部或部分数据.通过控制器的指令触发所展现的一种特殊的数据格式。它们是基于像JSP、ASP、PHP之类模板系统的脚本,较易与AJAX技术进行整合。
控制器: - - 通过软件代码控制模型环绕视图之间的交互.控制器在接收、确认输入后执行修改数据模型状态的业务操作。
-在MVC模式下,控制器接收了所有来自应用程序的请求后,调用模型去准备视图所需要的数据,然后视图使用由控制器提供的数据最终生成一个可视的响应。MVC的抽象概念可通过以下图形进行表述:
Struts2 环境设置
步骤一:- 在这个地址下载最新版本的Struts2 二进制文件: http://struts.apache.org/download.cgi 。
步骤二: 在web工程下引入jar包
步骤三 :配置XML文件
1.配置web.xml文件
正如前面所讨论的,这个文件为每个web应用程序提供接入点。在部署描述符(web.xml)中,Struts2 应用程序的接入点将会定义为一个过滤器。因此我们将在web.xml里定义一个FilterDispatcher类的接入点,而这个web.xml文件需要在WebContent/WEB-INF文件夹下创建。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>sh-struts01</display-name>
<filter>
<!-- struts2 的核心过滤器 -->
<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>
注意,我们将Struts2 过滤器映射到 /* ,而不是 /*.action ,这意味着所有的url都会被Struts过滤器解析。
Struts2 架构
Struts2 是一个MVC拉动的(或MVC2)框架,Struts2 的模型-视图-控制器模式是通过以下五个核心部分进行实现的:
- 操作(Actions)
- 拦截器(Interceptors)
- 值栈(Value Stack)/OGNL
- 结果(Result)/结果类型
- 视图技术
请求生命周期
- 用户发送一个资源需求的请求到服务器(例如:页面)。
- 核心控制器查看请求后确定适当的动作。
- 使用验证、文件上传等配置拦截器功能。
- 执行选择的动作来完成请求的操作。
- 另外,如果需要的话,配置的拦截器可做任何后期处理。
- 最后,由视图显示结果并返回给用户。
Struts2 Hello World示例
当你在Struts2 的web应用程序里点击一个超链接或提交一个HTML表单时,会由控制器收集输入并发送一个叫Actions的Java类。Action被执行后,Result会选择一个资源给予响应。这个资源通常是一个JSP,也可以是一个PDF文件,一个Excel表格,或者是一个Java小程序窗口。
一: 创建 Action
Action类是Struts2 应用程序的关键,我们通过它实现大部分的业务逻辑。当用户点击一个URL时,由Action类来响应用户操作。一个或多个Action类的方法被执行,并返回一个字符串结果。基于结果的值,会呈现一个特定的JSP页面。
package com.lanou3g.controller;
import com.lanou3g.entity.User;
import com.opensymphony.xwork2.ActionSupport;
public class HellowController extends ActionSupport{
//struts 请求参数获取
//是通过在类里面写属性 并且需要set get 方法
//那么只需要统一 页面的请求参数 和 属性名
//就可以自动获取参数
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String world() {
//System.out.println(user.getUserName()+user.getPassword());
System.out.println("哈哈哈");
return "success";
}
}
// Action 是以前常用的controller 层接口
// 现在用的一般是 ActionSuppoort 实现类
//这个类不仅有Action的功能
//也实现了一些其他接口
/*public class HellowController implements Action{
@Override
public String execute() throws Exception {
// TODO 自动生成的方法存根
return null;
}
}*/
这是一个非常简单的具有“user”属性的类。对于“user”属性,我们用标准的getter和setter方法,以及一个返回“success”字符串的执行方法。
Struts2 框架将创建一个"HellowController"类的对象,并调用execute方法来响应用户的动作。你把你的业务逻辑放进world方法里,最后会返回字符串常量。简单的描述每个URL,你需要实现一个Action类,你也可以用类名直接作为你的动作名,或者如下面内容所示使用 struts.xml 文件映射到其他user上。
<?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>
<!-- 一个请求==>web.XML ==>Struts 的核心过滤器 ==>Struts.xml
==>先找package ==> action ==> 找方法 ==> 找到class == 找到method
==> 根据返回值匹配 result
==>如果 result 需要 转发/重定向 ==> 再去找网页资源
-->
<!-- 管理请求 -->
<!-- 所有的Struts标签是跟标签 所有的Struts 配置都写在里面 -->
<package name="hello" namespace="/hello" extends="struts-default">
<!-- name 标签 是这个package 的名字 -->
<!-- namespace 是这个package 是请求路径 -->
<!-- extends 是默认的配置 -->
<action name="hi" class="com.lanou3g.controller.HellowController" method="world">
<!-- action 是具体的请求名 name属性是请求的具体路径 -->
<!-- class 就是 这个请求 具体在哪个类 -->
<!-- method 就是这个类类面具体哪个方法来执行 -->
<result name="success" type="redirect" >/zhuye.html</result>
<result name="error" type="dispatcher" >/zhuye.html</result>
<result name="redirect" type="redirectAction">/redirect</result>
</action>
<action name="redirect" class="com.lanou3g.controller.UserAction" method="redirectAction">
<result name="redirect">/index.html</result>
</action>
</package>
<!-- <package name="user" namespace="/user" extends="struts-default"></action>
</package> -->
</struts>
动态请求
<?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>
<package name="user" namespace="/user" extends="struts-default">
<action name="loginnn" class="com.lanou3g.controller.UserAction" method="login">
<result name="login">/index.html</result>
</action>
</package>
<!-- 动态请求 * 表示通配符-->
<package name="cal" namespace="/cal" extends="struts-default">
<!-- struts2.5 必须 加上这句话 才能使用通配符 -->
<global-allowed-methods>regex:.*</global-allowed-methods>
<action name="cal_*" class="com.lanou3g.controller.CalAction" method="{1}">
<!--
首先访问 cal_xxx 这个请求路径
然后 根据 xxx 匹配 {1}
如果找到了 XXX方法 就会运行XXX方法的代码
如果返回值 匹配 也会 跳转到 XXX,HTML
-->
<result name="success">/{1}.html</result>
</action>
</package>
<!-- 常量配置 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<!-- 动态请求激活 -->
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<!-- 返回值response 和 本地编码格式 -->
<!-- <constant name="struts.action.extension" value="action"></constant> -->
<!-- 控制请求后缀能否以.action 结尾
value 的值表示能以什么结尾
-->
<constant name="struts.devMode" value="true"></constant>
<!-- 热加载 我们不需要重启服务器就能让配置文件生效 -->
</struts>
可以通过 <incude> 标签 将其他配置文件引入
<include file="com/lanou3g/entity/struts2.xml"></include>
将其配置在Struts.xml文件里 相当于在Struts.xml 文件里配置 Struts2.xml 里的配置
package com.lanou3g.controller;
import com.opensymphony.xwork2.ActionSupport;
public class CalAction extends ActionSupport {
public String add() {
System.out.println("加法");
return SUCCESS;
}
public String minus() {
System.out.println("减法");
return SUCCESS;
}
public String che() {
System.out.println("乘法");
return SUCCESS;
}
public String chu() {
System.out.println("除法");
return SUCCESS;
}
}
动态请求可以解决在同一个Action内实现多个方法而不用重复配置 当然 这些方法的返回值要一致
Struts2 ajax 返回json 字符串:
action
package com.lanou3g.controller;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.lanou3g.entity.User;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction02 extends ActionSupport {
private String result001;
public String getResult001() {
return result001;
}
public void setResult001(String result001) {
this.result001 = result001;
}
public String text() throws JsonProcessingException {
User user = new User();
user.setUserName("吴彦祖");
user.setPassword("1245489");
ObjectMapper mapper = new ObjectMapper();
result001 = mapper.writeValueAsString(user);
System.out.println(result001);
return SUCCESS;
}
}
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>
<package name="ts" namespace="/ts" extends="struts-default,json-default">
<action name="test" class="com.lanou3g.controller.UserAction02" method="text">
<result>
<param name="root">result001</param>
</result>
</action>
</package>
</struts>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>这是我们使用AJax实现前后端交互的页面</h1>
用户:<input class="name" name="username" type="text"/><br/>
密码:<input class="pass" name="password" type="password"/><br/>
邮箱:<input class="birth" name="birthdat" type="date"/><br/>
<input class="sub" type="submit" value="提交"/>
</body>
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script type="text/javascript">
$(".sub").click(function() {
$.ajax({
url:"/sh-struts02/json/text",
data:{},
dataType:"json",
type:"get",
success:function(data){
console.log(data);
var v = eval("("+data+")");
console.log(v);
}
})
})
</script>
</html>
要使返回的data 是json字符串 需要在xml文件里配置json-default 属性
<package name="ts" namespace="/ts" extends="struts-default,json-default">