Struts2入门1 Struts2基础知识

时间:2022-04-09 20:58:40

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