java基础学习之 struts2初识

Strusts2 MVC 架构

模型(Model) -视图(View) -控制器(Controller),通常简称MVC ,是一种开发web应用的程序的软件设计模式.该软件设计模式由以下三部分组成:

模型: - - 属于软件设计模式的底层基础,主要负责数据维护.它通过响应视图的请求和控制器的指令来更新自身的数据。

视图: - - 这部分是负责向用户呈现全部或部分数据.通过控制器的指令触发所展现的一种特殊的数据格式。它们是基于像JSP、ASP、PHP之类模板系统的脚本,较易与AJAX技术进行整合。

控制器: - - 通过软件代码控制模型环绕视图之间的交互.控制器在接收、确认输入后执行修改数据模型状态的业务操作。

-在MVC模式下,控制器接收了所有来自应用程序的请求后,调用模型去准备视图所需要的数据,然后视图使用由控制器提供的数据最终生成一个可视的响应。MVC的抽象概念可通过以下图形进行表述:

Struts2 环境设置

步骤一: 

步骤二: 在web工程下引入jar包


步骤三 :配置XML文件

1.配置web.xml文件

web.xml配置文件是一种J2EE配置文件,决定servlet容器的HTTP元素需求如何进行处理。它严格来说不是一个Struts2 配置文件,但它是Struts2 运作所需要进行配置的文件。

正如前面所讨论的,这个文件为每个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 高级系统架构下的模型、视图及控制器。控制器是通过Struts2 分派servlet过滤器以及拦截器进行实现,模型是通过Actions进行实现,而视图则是结果类型和结果的结合。值栈和OGNL提供共同的路线、链接以及与其他组件之间的集成。
除了上述部分,还有许多组件相关的信息。web应用程序组件、Actions组件、拦截器组件、结果组件等等。

请求生命周期

通过上述图片的描述,我们可以依照下面几点解释在Struts2 中用户的请求生命周期:
  • 用户发送一个资源需求的请求到服务器(例如:页面)。
  • 核心控制器查看请求后确定适当的动作。
  • 使用验证、文件上传等配置拦截器功能。
  • 执行选择的动作来完成请求的操作。
  • 另外,如果需要的话,配置的拦截器可做任何后期处理。
  • 最后,由视图显示结果并返回给用户。

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">


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值