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包中的类的常用工具方法,从而使代码保持简洁干爽。
一、搭建Struts2项目步骤
1、根据需求导入相关jar包
2、在web.xml文件中配置strus2过滤器
<?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>
3、编写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中配置启动开发模式的好处:
可以输出日志记录,便于程序设计
修改struts.xml配置文件中后就不用重新部署项目,直接生效。
打印出更详细的错误信息
4、编写Action类
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";
}
}
二、Action实现方式
Action实现方式:普通pojo类、实现Action接口 、继承ActionSupport
Struts2 中通常直接使用 Action 来封装 HTTP 请求参数,因此,Action 类里还应该包含与请求参数对应的属性,并且为属性提供对应的 getter 和 setter 方法。
1、普通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";
}
}
2、实现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;
}
}
3、继承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";
}
}