Struts2基础入门(有源码)

                                                         目标:

理解Struts的体系结构
掌握Struts的基本用法

1. Struts简介
      Struts是前身是由CraigR.McClanahan编写的JSPModel2架构之Application Framework源码贡献给Apache基金会,因此也成为现在Apache Jakarta项目中的Struts Framework。Apache Jakarta项目中除了Struts还包括Tomcat、Ant和Velocity等。
      当建立一个建筑物时,建筑工程师会设计好建筑物的支柱,为每一层的建筑提供支撑。软件工程师设计一个软件项目时,同样也要先设计好软件的支柱,这里我们可以用Struts来做为软件项目的支柱。Struts的目的是帮助减少在开发过程中使用MVC设计模型带来的应用时间,Struts将为软件开发过程减少许多繁琐的过程。
      Struts2是一个用于创建企业级Java Web应用程序的可扩展框架,该框架的目的是简化整个开发周期,从建设、部署和维护应用程序。Struts2的原名WebWork2。经过几年独立开发,WebWork和Struts社区联手创建Struts2。这个新版本的Struts使用更简单。
2. Struts下载
      Struts官网下载地址是http://jakarta.apache.org/ ,选择“Ex-Jakarta” 项目下的“ Struts”超连接,进入到Struts的下载界面,在界面的左侧有一个菜单栏,如下图:

      选择“Documentation”下的Struts版本,此处下载最新的Struts 2.2.1.1(GA),进入到下载界面,如下图:

    现在点击“Download Now” 进入Struts的下载界面,该界面中会有所Struts版本的下载选项,此处只下载Struts2.2.1.1,看下图:(此处还有另外两个下载选项“Get Started”和“Plugin Registry”,可以根据自己的需要选择相应的项。)

      此处建议下载“struts-2.2.1.1-all.zip”,下载该zip文档将Struts的源码、API文档、jar包以及实例全部下载完成。下载完后,如下图:

3. Struts体系结构
      Struts的体结构图如下:

      框架中分为三个部分:模型、控制器和视图。
      在Struts框架中,模型分为两个部分:1.系统的内部状态;2.可以改变状态的业务逻辑。内部状态通常由Bean表示。根据设计或应用程序的复杂度的不同,这些Bean可以是自包含的并具有持续的状态,或只在需要的时候才获取数据。大型应用程序通常在方法内部封装业务逻辑(操作),这些方法可以被拥有状态信息的Bean调用。比如购物车Bean,它拥有用户购买商品的信息,可能还有checkOut()方法用来检查用户的信用卡,并向仓库发定货信息。
      小型程序中,操作可能会被内嵌在Action类,它是struts框架中控制器角色的一部分。当逻辑简单时这个方法很适合。建议用户将业务逻辑(要做什么)与Action类所扮演的角色(决定做什么)分开。
      视窗:由JSP建立,struts包含扩展自定义标签库,可以简化创建完全国际化用户界面的过程。
      控制器:struts中,基本的控制器组件是ActionServlet类中的实例Servelt,实际使用的Servlet在配置文件中由一组映射(由Action Mapping类进行描述)进行定义。

4. Struts的操作流程
      Struts的操作流程图如下:

      服务器启动后,根据web.xml加载Action Servlet读取struts.xml文件内容到内存。以登陆为例:第一次进login.jsp会先实例化FormBean、把默认值赋给表单元素。
      输入用户名密码提交表单、提交到action属性的login.do,通过ActionServlet读struts.xml文件找到action下的path属性找到.do,通过name属性找form-beans中的form-bean的name属性得到ActionForm的包名类名,先实例化form,把表单的值填充给form,调用form的validate方法验证、ActionErrors返回null表示验证通过,否则失败返回input指定的页面。验证通过会实例化Action,执行Action的excute方法。

5. 第一个Struts
       第一步:建项目并加载Struts2包。
       使用Eclipse建立一个Dynamic Web Project项目,将下载的Struts文件夹中lib目录下的几个jar文件,拷贝放置到项目WebContent文件夹WEB-INF文件夹lib目录下,要拷贝的jar文件项目图如下:

      第二步:WEB项目中安装Struts2。
      Struts2采用的是过滤器,所以先在web.xml文件中配置一个Filter,web.xml配置文件的内容如下:

<?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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 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>NetJavaStruts</display-name>
<!-- 在WEB项目中安装Struts2 -->
  	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>			org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
		</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
<welcome-file-list>
	    <welcome-file>index.html</welcome-file>
	    <welcome-file>index.htm</welcome-file>
	    <welcome-file>index.jsp</welcome-file>
	    <welcome-file>default.html</welcome-file>
	    <welcome-file>default.htm</welcome-file>
	    <welcome-file>default.jsp</welcome-file>
  	</welcome-file-list>
</web-app>

      第三步:编写Action

package sample;
import com.opensymphony.xwork2.ActionSupport;
/**
 * 定义一个Login的Action类,该类继承自ActionSupport类
 * Struts2中,Action类已经和FormBean类集成到一起。
 * @author 熊向军
 */
public class Login extends ActionSupport{
	//定义一个私有的字符串类型的账号属性
	private String username;
	//定义一个私有的字符串类型的密码属性
	private String password;

	/**
	 * 设置账号属性的方法
	 * @param username是要从界面上接受的参数值
	 */
	public void setUsername(String username){
		//测试输出
		//System.out.println(username);
		this.username = username;
	}

	/**
	 * 获取账号属性值的方法
	 * @return 返回账号属性的值username
	 */
	public String getUsername(){
		return username;
	}

	/**
	 * 设置密码属性的方法
	 * @param password是要从界面上接受的参数值
	 */
	public void setPassword(String password){
		//测试输出
		//System.out.println(password);
		this.password = password;
	}

	/**
	 * 获取密码属性值的方法
	 * @return 返回账号属性的值password
	 */
	public String getPassword(){
		return password;
	}

	/**
	 * 这是Action类的执行方法,所有从客户端发送到LoginAction的请求都将有该方法处理。
	 * @return 会返回执行后要显示的结果,该结果在sample.xml文件中已经配置好,对应的是<action>标记中<result>标记的name属性。
	 */
	public String execute() throws Exception{
		//验证账号和密码是否不为null或者账号和密码长度大于0,如果成立则返回到执行成功的页面,如果失败则返回登录页面
		if(validator(getUsername()) && validator(getPassword())){
			//System.out.println("===>");
			//返回值对应<result>标记name属性的值
			return "view_Success";
		}else{
			//System.out.println("--->");
			//返回值对应<result>标记name属性的值
			return "view_Login";
		}
	}

	/**
	 * 验证账号和密码是否为空
	 * @param value表示的是账号值或者密码值
	 * @return 返回验证后的结果,如果验证为真,则返回TRUE,否则返回FALSE
	 */
	public boolean validator(String value){
		//System.out.println(">>>>>>>>>>>>>>>"+value);
		boolean state = false;
		//如果账号和密码为null或者小于等于0,则返回FALSE,反之返回TRUE。
		if(null != value && value.length() > 0)
			state = true;
		return state;
	}
}

 

      Struts2已经将Action类和FormBean类整合到一起了,所以,此处将在Action类中,定义FormBean;先定义两个私有的属性username和password,分别添加它们的getter和setter方法;再定义一个验证username和password是否为null和长度是否为0的validator方法;再重写execute()方法,该方法是执行,不能缺少哦!并在方法中调用验证方法。

      第四步:编写Struts.xml
      在Eclipse中必须自己去建立xml文件,先在NetJavaStruts项目的src目录下建立一个XML文件,文件的名字是struts.xml,struts.xml文件的内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
	"http://struts.apache.org/dtds/struts-2.0.dtd">
<!-- struts是根元素 -->
<struts>
	<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
	<constant name="struts.devMode" value="false"/>
	<!-- 加载配置文件 -->
	<include file="sample.xml"/>
</struts>

       <struts>标签是Struts2配置的根元素;<constant>标签表示设置常量;<include>标签表示加载配置;Struts2提供的一个特殊标签,可以允许开发人员将配置文件分散开来,这样就不会导致一个配置文件中写N多配置信息,有助于管理;建议采用这种方式来开发,属性file表示要加载的配置文件名。

      第五步:编写Struts配置信息
      在src目录下建立一个example.xml的XML文件,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
	"http://struts.apache.org/dtds/struts-2.0.dtd">
<!-- struts是根元素-->
<struts>
	<package name="sample" namespace="/sample" extends="struts-default">
		<action name="validator" class="sample.Login">
			<result name="view_Success">/main.jsp</result>
			<result name="view_Login">/login.jsp</result>
		</action>
	</package>
</struts>

      在<struts>标签中可以定义多个<package>标签,<package>标签是用来设置包的;name属性表示包的名字,可以被其他的package通过该名字引用;namespace表示命名空间,类似于Servlet的请求路径,当然此处也是设置的请求路径;extends表示该配置文件继承自哪里,默认使用的是(大部分使用的都是)struts-default。在<package>标签下也可以有多个<action>标签,<action>标签是用来设置每一个动作请求的;name属性用来表示该动作的名字,class表示该动作所对应的类是哪一个。<action>标签下可以有多个<result>标签,每一个标签对应一个处理后结果要显示的页面,切记name属性中的值要和Action类中的返回的值一一对应。
      Struts2中除了绝对配置,还可以使用其他的配置方式:

 

<!-- name指定action工作单元的名字为Login_*,*号表示只要是以Login_开头的都将由该工作单元匹配;
		method表示用哪个方法来处理,此处{1}将由动作名来的方法来处理;
		class是指定该工作单元所指定的类全路径 -->
		<action name="Login_*" method="{1}" class="example.Login">
			<!-- name表示要返回值的是input,如果返回input,则由/example/Login.jsp来显示 -->
			<result name="input">/example/Login.jsp</result>
			<!-- type表示将执行Action,此处执行Menu名字的Action -->
			<result type="redirectAction">Menu</result>
		</action>
		<!-- name指定action工作单元的名字为*,*号表示匹配所有的;
		class是指定该工作单元所指定的类全路径 -->
		<action name="*" class="example.ExampleSupport">
			<!-- 表示将由动作名所对应的*.jsp来显示结果 -->
			<result>/example/{1}.jsp</result>

 
     第六步:编写JSP
     JSP页面有三个,分别如下:

index.html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="refresh" content="0;url=login.jsp">
<title>第一个Struts2示例</title>
</head>
<body>
<h3>加载中...</h3>
</body>
</html>
说明:Mete标签的http-equiv属性中的refresh表示刷新的意思,content属性中的第一个参数0,表示间隔0秒就开始刷新,url就表示刷新后要跳转的页面是login.jsp
login.jsp
<%@ 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>第一个Struts2示例</title>
</head>
<body>
<h3>用户登录</h3>
<s:form action="sample/validator.action">
	<s:textfield name="username" label="账号"></s:textfield>
	<s:password name="password" label="密码"></s:password>
	<s:submit value="登录"></s:submit>
</s:form>
</body>
</html>
说明:此页面中使用了Struts2带的标签库,这一行代码是引入Struts2的标签库<%@ taglib prefix="s" uri="/struts-tags" %>;红色边框中的内容是关于Struts2标签的使用方式。
main.jsp
<%@ 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>第一个Struts2示例</title>
</head>
<body>
<h1><s:property value="username"/></h1>
</body>
</html>
说明:此页面中使用了Struts2标签库的property标签,value属性中的名字,必须要在Action中存在该属性,否则无法显示其结果。

      到这里就已经成功了完成了第一个Struts2示例,此处使用的版本是Struts 2.2.1.1,看到这里了,就该你开工动手了,享受最后出来的成果吧!嘿嘿!

      index.html页面运行的结果如下图:

       login.jsp页面运行的结果如下图:

       main.jsp页面运行的结果如下图:

       在学习的时候,建议到官网上,下载完整的zip文档,然后参考里边的几个示例,这样上手会比较快。当然,如果你的英文更好,可以直接看官方提供的文档,我的英语不是很好所以有点麻烦,嘿嘿!就先到这里了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值