Struts2认知

本文介绍了Struts2框架的基本概念,包括其定义、特点及如何搭建开发环境。详细讲解了Struts2的核心组件配置,如Filter配置、struts.xml文件结构,并提供了自定义结果视图的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. Struts2的定义

Apache Struts 2 is an open-source web application framework for developing Java EE web applications. It uses and extends the Java Servlet API to encourage developers to adopt a model–view–controller (MVC) architecture. ——from Wikipedia

Apache Struts 2是一个开放源代码,支持开发java EE应用的的Web应用框架。它使用和扩展java Servlet API,鼓励开发者采取模型–视图控制器(MVC)架构。——来自维基百科

2. 关于Struts2

  1. Struts2主要是基于webwork核心的
  2. Struts2已经逐步被SpringMVC替代,原因有SpringMVC的优点,自然也有Struts2的不足:参见
    http://blog.youkuaiyun.com/chenleixing/article/details/44570681

3. Struts2起步

3.1 登录Struts官网下载(建下载Full Distribution完整版,技术支持可以下载Documentation相关文档)。
3.2 解压目录结构

apps->包含了基于Struts2的示例
docs->包含有Struts2技术支持的相关文档
lib->(重要)包含Struts2的核心类库,相关第三方插件类库
src->源码

3.3 主要jar包介绍

  • Struts2-core-**.jar : Struts框架的核心类库
  • Xwork-core-**.jar : command模式框架,webwork和struts2都基于xwork
  • ornl-**,jar : 对象图导航语言(Object Graph Navigation Language),struts2框架通过其读写对象的属性
  • reemarker-2.3.18.jar:Struts 2的UI标签的模板使用FreeMarker编写
  • commons-logging-1.1.x.jar:ASF出品的日志包,Struts 2框架使用这个日志包来支持Log4J和JDK 1.4+的日志记录。
  • commons-fileupload-1.2.2.jar: 文件上传组件,2.1.6版本后需要加入此文件
  • commons-io-2.0.1.jar:传文件依赖的jar包
  • commons-lang-2.5.jar:对java.lang包的增强- javassist-3.11.0.GA.jar:动态代理的开发包。日本的(Jboss)。Hibernate也会用到

. 新建一个web项目,从apps中struts2-blank中lib下的jar包拷到项目lib下
4. 在web.xml中配置Struts2的核心Filter

```
<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>
```
  1. 在src下新建一个Struts.xml,配置该配置文件。

    <?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"/>
    
        <package name="default" namespace="/" extends="struts-default">
            <!--to login page-->
            <action name="toLogin" >
                <result>/login.jsp</result>
            </action>
        </package>
    </struts>
  2. 写一个动作类
public class OrderAction extends ActionSupport {
    //bean
    private OrderService orderService;
    //bussiness
    public String orderDetail(){
        order = orderService.findOneById(id);
        return SUCCESS;
    }
    //getter&setter
        public void setOrderService(OrderService orderService) {
        this.orderService = orderService;
    }
}

Struts2的相关配置文件

Struts2的配置文件体系

  1. default.properties:在struts2-core-**.jar的org.apache.struts包中
    关于Struts2一些常量配置(框架内部)
  2. struts-default.xml:在struts2-core-**.jar中。(框架内部)
    定义了一些bean;
    定义了一个抽象的包:struts-default
    • 定义了一些结果视图类型
    • 定义了一些拦截器和拦截器小组
  3. struts-plugin.xml :在struts2的第三方插件中(插件内部)
  4. struts.xml:用户自己编写的(重点)
  5. struts.properties:用户自己编写的(类路径中。不需要)
  6. web.xml:struts2的一些配置可以写在这(Web应用中。不需要)

default.prorerties

  • 在struts2-core-**.jar的org.apache.struts包中
  • 配置了一些关于Struts2一些常量配置(框架内部)
  • 配置常量的方式(依次加载覆盖):
    • 通过struts.xml(常用)
    • 通过struts.properties
    • 通过web.xml

常用属性:

请求相关
  • 设置访问action的后缀
struts.action.extension=action,,
  • 设置web默认字符编码集,对处理中文请求参数很有用
struts.i18n.encoding=UTF-8
文件上传相关
  • 设置处理multipart、form-data的MIME类型
    jakarta:使用common-fileupload文件上传框架(默认值)
struts.multipart.parser=jakarta
  • 设置上传文件临时保存路径
struts.multipart.saveDir=
  • 设置文件上传允许的最大字节数
struts.multipart.maxSize=2097152
开发时相关
  • 设置是否使用开发者模式,在开发时设置true会提示更多,更友好的错误
struts.devMode = false
  • 设置浏览器是否缓存静态类容(在开发时,如果希望每次都获得服务器最新响应,可可设置其为false)
struts.serve.static.browserCache=true
  • 设置Struts是否支持动态方法调用
struts.enable.DynamicMethodInvocation = false
国际化

指定国际化资源文件,多个用,隔开

struts.custom.i18n.resources=testmessages,testmessages2

sturts-default.xml

在struts2-core-**.jar中。(框架内部)

  • 定义了一些bean;
  • 定义了一个抽象的包:struts-default
  • struts-default下定义了一些结果视图
  • 常用的结果视图:
    • chain:转发到Action
    • dispatcher:视图转发(默认)
    • redirect:视图重定向
    • redirectAction:重定向到Action
    • stream:使用InputStream,常用于文件下载
  • struts-default下定义了一些拦截器和拦截器小组(默认拦截器组defaultStack)
  • struts-default设置了默认Action为com.opensymphony.xwork2.ActionSupport

struts.xml重点

struts.xml的骨架结构

注意点

配置action的method配置
1. 必须是public修饰的
2. 不可以带参数
3. 返回值必须是String
配置结果视图重定向到其它名称空间
```
<result  type=”redirectAction” >
        <param name=”namespace”>/house</param>
        <param name=”actionName”>/addhouse</param>
</result>

```
param注入调用的是setter方法,故在注入类必须定义setter方法
自定义结果集
  1. 实现com.opensymphony.xwork2.Result接口,或者继承自该接口的实现类org.apache.struts2.dispatcher.StrutsResultSupport

        public class MyResultType implements Result {
        //由param注入
        private int width ;
        private int height  ;
        //必须要有setter
        public int getWidth() {return width;}
        public void setWidth(int width) {this.width = width;}
    
        public int getHeight() {return height;}
        public void setHeight(int height) {this.height = height;}
        //重写execute
        @Override
        public void execute(ActionInvocation invocation) throws Exception {
            //生成验证码
            ValidateCode validateCode = new ValidateCode(width,height,4,10);
            String code = validateCode.getCode();
            System.out.println("验证码:"+code);
            //怎么把验证码显示到页面
            //怎么在struts2中使用servlet的api
            HttpServletResponse response =   ServletActionContext.getResponse();
            //把验证码展示到页面
            validateCode.write(response.getOutputStream()); 
        }
    }
  2. 配置struts.xml
<!-- 配置自定义结果视图 -->
 <result-types>
    <result-type name="yanzhengma" class="com.itqf.resulttype.MyResultType">
    </result-type>
 </result-types>
<!--将结果视图配置给action--> 
<action name="showImg" >
    <result type="yanzhengma">
    <!-- 给自定义结果类型注入值 -->
        <param name="width">500</param>
        <param name="height">100</param>
    </result>
</action> 

访问Servlet API

方式一:通过ServletActonContext工具类:

//获得一个HttpServletRequest对象
HttpServletRequest request =  ServletActionContext.getRequest();
//获得一个HttpServletResponse对象 
HttpServletResponse response = ServletActionContext.getResponse();
//获得一个ServletContext对象
ServletContext servletContext =  ServletActionContext.getServletContext();
//获得一个Session对象
HttpSession session = request.getSession();

方式二:通过ActionContext对象

//得到ActionContext对象
ActionContext actionContext =   ActionContext.getContext();
//2通过ActionContext得到session域对象(一个map集合)
Map<String, Object> sessionMap =  actionContext.getSession();
//获得application域对象
Map<String, Object> applicationMap = actionContext.getApplication();
//request对象
Map<String, Object> requestMap =   (Map<String, Object>) actionContext.get("request");

方式三:通过实现接口

  1. ServletContextAware:通过该接口可以直接访问ServletContext
  2. ServletRequestAware:访问HttpServletRequest
  3. ServletResponseAware:访问HttpServletResponese
//实现接口
public class MyAction3 implements ServletRequestAware {
    //定义变量
    private HttpServletRequest request;
    //重写setter
    public void setRequest(HttpServletRequset request){
        this.request = request;
        }
}

Page和Action间数据的交互

Action 接收Page的值

字段方式

page:

<form action="login1.action">
        用户名:<input type="text" name="username"><br>
        密码:<input type="password" name="password"><br>
        <input type="submit" value="登录">
</form>

action:

    //1,把页面需要向动作类传值的字段声明出来
    private String username;
    private String password;
    //2,设置get set方法(必须,因为是用注入的方式写入的)

通过Bean

page:

//注意name是对象名.字段名 OGNL表达式格式
<form action="login1.action">
        用户名:<input type="text" name="user.username"><br>
        密码:<input type="password" name="user.password"><br>
        <input type="submit" value="登录">
</form>

action:

//1.声明user类
private User user;
//2.设置getter&setter方法
...

通过Map

page:

//注意name是对象名.字段名 OGNL表达式格式
<form action="login1.action">
        用户名:<input type="text" name="users['u1'].username"><br>
        密码:<input type="password" name="users['u1'].password"><br>
        <input type="submit" value="登录">
</form>

action:

//1.声明user类
private Map(String,Object) users;
//2.设置getter&setter方法
...
//3.取值
User user = (User)users.get("u1") ;

通过模型驱动

page和上面一样
action:

// 实现ModelDriven接口
public class LoginAction3  implements ModelDriven<User>{
    //新建一个user对象
     private  User user = new User();
     //重写getModel()方法
    @Override
    public User getModel() {
        // TODO Auto-generated method stub
        return user;
    }

自定义转换器

  1. 继承org.apache.struts2.util.StrutsTypeConverter(最简单和方便)
  2. 覆盖convertFromString,convertToString方法
    public class DataConvertor extends StrutsTypeConverter{
        private DateFormat dateFormat = new SimpleDateFormat("yy-MM-dd");
        //字符串转Date
        @Override
        public Object convertFromString(Map map, String[] strings, Class aClass) {
            if(aClass == Date.class){
                String date = strings[0];
                try {
                    return dateFormat.parse(date);
                } catch (ParseException e) {
                    e.printStackTrace();
                }
            }
            return null;
        }
        //日期转字符串
        @Override
        public String convertToString(Map map, Object o) {
            if(o instanceof Date){
                Date date = (Date)o;
                return  dateFormat.format(date);
            }
            return null;
        }
    }
  1. 编写配置文件
    • 全局配置:
      • 在src根目录下创建一个文件,名为xwork-conversion.properties:
      • 配置com.util.Date=com.util.StudentConverter;
    • 局部配置:
      • 在需要使用该转换器的Action的目录下创建:
      • date=com.util.StudentConverter(date为Action中的字段名)

Page访问Action数据

Struts ValueStack

Stack Context

OGNL表达式

OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个单独的开源项目。 Struts2框架使用OGNL作为默认的表达式语言,OGNL使用必须依赖struts标签支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值