Struts2入门1 Struts2基础知识 20131130
代码下载: 链接: http://pan.baidu.com/s/11mYG1 密码: aua5
前言:
之前学习了Spring和Hibernate框架知识,因为Spring可以将Struts和Hibernate框架集成,所以还是要学习一些Struts框架技术。本章主要是Struts的简单介绍。
1.Struts2概述
Struts2是最流行的MVC框架技术,特使以WebWork和Struts1为基础,开发的新的框架技术,保留了Struts1的简单易用性,并且充分利用了WebWork的拦截器机制,也就是AOP的思想。
Struts2中大量的使用拦截器来处理用户请求,从而允许用户的业务逻辑控制器和ServletAPI分离,用户的请求交给Struts2的核心控制器FilterDispatcher。FilterDispatcher根据请求调用对应的Action的execute()方法,并且根据处理结果生成响应的JSP页面。Struts2框架内置了很多的拦截器,这些拦截器组成一个拦截器链,拦截器会自动队请求进行处理。
Struts2控制器组件是整个框架的核心,实际上,所有MVC框架都是以控制器组件作为核心的。Struts2的控制器组件有:FilterDispatcher和业务控制器Action组成。
1.1FilterDispatcher
FilterDispatcher是一个Servlet过滤器,他是Struts2的核心组件,作用于整个Web应用程序,需要在web.xml中配置Struts2的FilterDispatcher:
<?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>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.disaptcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
上面配置了FilterDispatcher过滤器,他会对所有的请求都会过滤处理。任何需要与Web整合的MVC框架都是需要借助web.xml配置文件。通常MVC框架都需要在web应用中添加一个核心控制器。对于Struts2而言,就是加载FilterDispatcher组件。只要web应用加载了FilterDispatcher,FilterDispatcher就会加载对应的Struts2框架,因为FilterDispatcher是一个过滤器,Web应用加载FilterDispatcher只需要在web.xml中使用filter和filter-mapping元素配置FilterDispatcher即可。
2.Action
Action是Struts2的业务控制器
package com.yang.stru2.action;
public class LoginAction {
private String userName;
private String password;
public LoginAction(){}
public String getUserName(){return this.userName;}
public void setUSerName(String userName){ this.userName = userName;}
public String getPassword(){return this.password;}
public void setPassword(String password){ this.password =password;}
public String execute(){
System.out.println("userName:" + userName);
System.out.println("pasword:" + password);
if("yang".equals(userName) && "12345".equals(password)){
return "success";
}
return "error";
}
}
上述类不需要继承Struts2的任何类或是实现任何几口,是一个完全的POJO,重用性很高。Struts2中的Action有如下优势:
Action类完全是一个POJO,具有良好的代码重用性;Action类无需和ServletAPI耦合,因此无论是应用还是测试都是十分方便;Action中的execute()方法仅仅返回一个字符串作为处理结果,该处理结果可以映射带任何试图或者是另一个Action。
实际上,Struts2应用中起作用的业务控制器不是用户定义的Action而是系统生成的Action代理类,该Action代理类以用户定义的Action为代理目标。
1.3配置文件
使用Struts2创建系统的Action代理的时候,在web.xml中配置Struts2的拦截器,同时还要使用Struts2的配置文件,此文件中需要对用户定义的Action进行相关信息的配置。配置文件有两种:
配置Action的struts.xml
配置Struts2的全局属性的struts.properties文件
struts.xml
在struts.xml配置文件总需要配置系统用到的Action,在配置Action的时候,需要制定该Action的实现,并指定该Action处理结果和视图资源之间的映射关系。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 指定项目处于开发阶段 -->
<constant name="struts.devMode" value="true"/>
<!-- Struts2 的 Action 都必须在package 里 -->
<package name="com.yang.stru2.action" extends="struts-default" namespace="/admin">
<!-- 定义一个login的Action,实现类是com.yang.stru2.action.LoginAction -->
<action name="login" class="com.yang.stru2.action.LoginAction">
<!-- 配置execute()方法返回值对应的页面 -->
<result name="error">/error.jsp</result>
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
上述的struts.xml文件中,声明了一个Action,并且执行了Action的实现类是LoginAction,同时将execute()方法的返回值和视图资源之间的映射关系
struts.properties
在这个文件中可以配置Struts2的全局属性
#指定Web的默认编码集合,相当于调用HttpServletRequest的时候使用了setCharacterEncoding
struts.il8n.encoding=utf-8
#当修改struts.xml之后需要重新加载配置文件,在开发阶段打开
struts.configuration.xml.reload=true
#设置浏览器是否缓存静态诶荣,开发阶段最好关闭浏览器缓存
struts.serve.static.browserCache=false
1.4Struts2标签库
Struts的一个重要的组成部分就是标签库,提供了非常丰富的功能,这些标签不仅提供了表示层数据处理,而且提供了基本的流程控制,还提供了国际化支持、Ajax技术等功能。通过struts2标签库,可以减少代码的编写。
1.5Struts2的处理请求过程分析
Struts2一般只是用于Web框架:
1)客户段发出请求,比如/mypage.action
2)这个请求经过核心控制器FilterDispatcher过滤处理,FilterDispatcher将请求转交给响应的Action代理;
3)Action代理通过配置文件中的信息找到对应的Action类,创建Action对象并且调用对应的Action的代理
4)在调用Action的过程前后,设计相关拦截器的调用。拦截器链自动对请求应用通用功能,比如自动化工作流、验证或者是文件上传。
5)一旦Action执行完毕,Action的代理根据struts.xml中的配置信息找到execute()方法返回值对应的结果,返回结果通常是试图资源或者是另一个Action
2.基于Struts2的一个简单的应用
2.1配置应用环境
将Struts2核心类库放到Web项目中的lib目录下面:
all common package javaassist.jar
freemarket.jar,
ognl.jar
struts2-core.jar,
xwork.jar
同时需要修改web.xml的配置文件,加入Struts2的核心控制器FilterDispatcher,配置文件见上面的配置文件(其实这个和Servlet的配置方式是一样的)
2.2创建输出视图
<%@ 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>Add JSP</title>
</head>
<body>
<h1>Struts2 Add Function </h1>
<form action="add.action" id="calcForm" method="post">
<table>
<tbody>
<tr>
<td>First Number:</td>
<td><input type="text" name="num1"/></td>
</tr>
<tr>
<td>Second Number:</td>
<td><input type="text" name="num2"/></td>
</tr>
<tr>
<td><input type="submit" value="加"/></td>
</tr>
</tbody>
</table>
</form>
</body>
</html>
表单提交的目标是add.action
2.3实现业务逻辑类
2.4实现业务逻辑类
package com.yang.stru2.service.impl;
public class Calculator {
public double add(double a ,double b){
return a+b;
}
public double substract(double a, double b){
return a-b;
}
public double multiply(double a, double b){
return a*b;
}
public double divide(double a, double b){
return a/b;
}
}
2.5实现业务控制器
package com.yang.stru2.action;
import com.opensymphony.xwork2.ActionContext;
import com.yang.stru2.logic.Calculator;
public class AddAction {
private double num1;
private double num2;
public double getNum1(){return this.num1;}
public void setNum1(double num1){this.num1 = num1;}
public double getNum2(){return this.num2;}
public void setNum2(double num2){this.num2= num2;}
public String execute(){
Calculator cal = new Calculator();
double result = cal.add(num1, num2);
ActionContext.getContext().getSession().put("result", result);
return "cal";
}
}
2.5配置业务控制器
创建一个struts.xml在scr目录下面,对AddAction进行配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 指定项目处于开发阶段 -->
<constant name="struts.devMode" value="true"/>
<!-- Struts2 的 Action 都必须在package 里 -->
<package name="com.yang.stru2.action" extends="struts-default">
<action name="add" class="com.yang.stru2.action.AddAction">
<result name="cal">/add_result.jsp</result>
</action>
</package>
</struts>
2.6创建结果视图
<%@ 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>Add result</title>
</head>
<body>
<h1>计算器结果</h1>
<table>
<tbody>
<tr>
<td>FirstNumber:</td>
<td>${param.num1 }</td>
</tr>
<tr>
<td>Second Number:</td>
<td>${param.num2 }</td>
</tr>
<tr>
<td>Result:</td>
<td>${sessionScope.result }</td>
</tr>
</tbody>
</table>
<button onclick="history.go(-1)">Return</button>
</body>
</html>
这样就可以运行了。
调试程序:
1.关于包添加的问题
我们这种菜鸟刚接触这个框架的时候,想到的就是将所有的包都放到应用中,对于其他的框架,暂时没有发现什么错误,但是对于这个Struts2,如果我们将所有的包都放入到项目中,就会发现运行报错,其实我也不知道为什么,其中的很多的包都是没有用的。经常长时间的调试,我找到了这些包,虽然不是完全精确,但是相对比较精简了,很多教材中说,只添加核心的5个包就可以了,反正就是运行失败。
我添加的包:将所有的common命名的开头的都添加进去,然后就是按几个比较关键的freemarket.jar, javaassist.jar, ognl.jar, struts2-core.jar, xwork-core.jar这些包就可以了。
2.调试WARNING
我们在web.xml配置文件中使用的是org.apache.struts2.dispatcher.FilterDispatcher,就会看提示,但不是使用红色的ERROR输出,提示我们这个FilterDispatcher已经过时了,推荐我们使用其他的FilterDispatcher。确实是这个样子的,我们根据WARNING提示,打开网页,推荐我们使用的是另一个比较新的FilterDispatcher,名字比较长
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
YangTengfei
2013.11.30