Struts2入门

Struts2是基于MVC设计模式的流行和成熟的Web应用程序框架。java

最新版本是Struts 2.5.5web

Struts2.x 部分jar文件说明apache

文件名称 描述
struts2-core struts2框架核心库包
xwork 构建 Struts2 的 XWork 2 的库 (2.0及以上版本)。
ognl 对象图导航语言(OGNL), 该表达式语言的使用遍布框架的方方面面。
javassist OGNL使用的Java字节码操做库。
freemarker struts标签模板库文件。
commons-logging 通用日志, Struts 2 框架使用它来实现 JDK 1.4+ 和 log4J 之间的无缝透明支持。
commons-fileupload 为 Servlet 和 Web 应用添加稳定、高性能的文件上传功能。
commons-io 一个辅助开发 IO 功能的工具库。
commons-lang3 用于简化经常使用功能代码的使用用法。该库提供主要针对java.lang包中的类的经常使用工具方法,从而使代码保持简洁干爽。

1、搭建Struts2项目步骤

一、根据需求导入相关jar包设计模式

二、在web.xml文件中配置strus2过滤器app

<?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_3_0.xsd" version="3.0">
  <display-name>TestStruts</display-name>
   <!-- 配置struts2核心Filter(其余拦截器应该配置在struts2拦截器上方,不然失效) -->
  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <!-- 全部的Action类请求都会被struts2过滤器拦截 -->
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>*.action</url-pattern>
  </filter-mapping>
</web-app>

三、编写Struts2配置文件struts.xml(位于src目录)框架

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
	<!-- 
		package		定义一个包(一般一个业务模块使用一个包)
							做用:管理Action
		name				包名(用来区分不一样包,不一样package的name值不能重复)
		extends		当前包继承的包(struts中有必定要继承struts-default [struts-default包在 struts-default.xml定义],继承struts-default包后,可使用struts-default包中定义拦截器和结果类型 )
		abstract		表示当前包为抽象包,值为true/false(struts-default包的abstract值为true)。
							抽象包中不能有action,不然运行时会出错
		namespace	命名空间,默认为"/"
	 -->
	<package name="struts2" extends="struts-default" abstract="false">
		
		<!-- 配置全局结果集,在此package里每一个action共用的结果集 -->
		<global-results>
			<result name="success">/index.jsp</result>
		</global-results>
		<!-- 
			action		配置请求路径与Action类的映射关系
			name			请求路径名称
			class			请求处理的Action类全名,默认是com.opensymphony.xwork2.ActionSupport,在struts-default.xml中定义
			method		配置调用的处理方法
							没有指定method属性, 默认执行 Action类中 execute方法 
		 -->
		<action name="helloworld" class="cn.iborder.action.HelloWorldAction">
			<!-- 
				result		根据Action类返回的值进行相应处理
				name			Action类返回的值
				type			跳转的结果类型(默认值dispatcher)
				标签体		指定跳转的页面
			 -->
			<result name="success">/index.jsp</result>
		</action>
		<action name="login" class="cn.iborder.action.UserAction" method="login">
			<result name="login" type="redirect">/index.jsp</result>
		</action>
		
	</package>
	<!-- 
		引入其余配置文件
		config.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>
		    <package name="struts2" extends="struts-default" namespace="/">
		    	<action name="hello" class="cn.iborder.action.HelloAction" method="hello">
		    		<result name="hello">/hello.jsp</result>
		    	</action>
		    </package> 
		</struts>
		======================================================================
	 -->
	<!-- 加载src路径下的config.xml文件 -->
	<include file="/config.xml"></include>
</struts>

struts2中配置启动开发模式的好处:jsp

  • 能够输出日志记录,便于程序设计
  • 修改struts.xml配置文件中后就不用从新部署项目,直接生效。
  • 打印出更详细的错误信息

四、编写Action类ide

HelloWorldAction.java工具

package cn.iborder.action;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction extends ActionSupport {
	
	@Override
	public String execute() throws Exception {
		// TODO Auto-generated method stub
		System.out.println("执行HelloWorldAction");
        return "success";
	}

}

2、Action实现方式

Action实现方式:普通pojo类、实现Action接口 、继承ActionSupport性能

Struts2 中一般直接使用 Action 来封装 HTTP 请求参数,所以,Action 类里还应该包含与请求参数对应的属性,而且为属性提供对应的 getter 和 setter 方法。

一、普通pojo类

User.java

package cn.iborder.entity;

public class User {
	private String userName;
	private String password;
	
	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
}

UserAction.java

package cn.iborder.action;

import cn.iborder.entity.User;

public class UserAction {
	private User user;

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	public String login() {
		System.out.println("用户:"+user.getUserName());
		System.out.println("密码:"+user.getPassword());
		return "login";
	}
}

二、实现Action接口

package cn.iborder.action;

import com.opensymphony.xwork2.Action;

import cn.iborder.entity.User;

public class UserAction implements Action {
	private User user;

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	public String login() {
		System.out.println("用户:"+user.getUserName());
		System.out.println("密码:"+user.getPassword());
		return "login";
	}

	@Override
	public String execute() throws Exception {
		// TODO Auto-generated method stub
		return null;
	}
}

三、继承ActionSupport

须要使用struts2的数据校验功能,必须继承ActionSupport.

ActionSupport已经实现了Action接口,还实现了Validateable接口,提供了数据校验功能。经过继承该 ActionSupport 类,能够简化 Struts 2 的 Action 开发。

Actionsupport类在实现的Validateable接口中定义了一个 validate()方法,重写该方法,自定义数据校验功能,它会在execute()方法以前执行。在实现表单验证功能的时候必定不要忘记了在 struts.xml 中相对应的 action 中配置 result="input",由于表单验证失败默认返回的字符串为 input,若是没有的话会报错。

重写父类的validate()方法,会对对全部业务逻辑都验证,不推荐使用,建议自定义一个校验类,继承实现Validator接口的类,有ValidatorSupport或FieldValidatorSupport。

经过校验配置文件可使用Struts2已有的校验器

package cn.iborder.action;

import com.opensymphony.xwork2.ActionSupport;

import cn.iborder.entity.User;

public class UserAction extends ActionSupport {
	private User user;

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	public String login() {
		System.out.println("用户:"+user.getUserName());
		System.out.println("密码:"+user.getPassword());
		return "login";
	}
}
相关文章
相关标签/搜索