struts2学习


<struts> 

<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
        
        <action name="hell">
            <result>
                /Hello.jsp
            </result>
        </action>
    </package>

</struts>

一、action

具体Action的实现可以 1、是一个普通的java类   2、或者实现Action接口  3、不过最常用的是从ActionSupport继承,好处在于可以直接使用Struts2封装好的方法

Action执行的时候并不一定要执行execute方法
可以在配置文件中配置Action的时候用method=来指定执行哪个方法
也可以在url地址中动态指定(动态方法调用DMI)(推荐)  

        String path = request.getContextPath();

        struts2中的路径问题是根据action的路径而不是jsp路径来确定,所以尽量不要使用相对路径。
         虽然可以用redirect方式解决,但redirect方式并非必要。
        解决办法非常简单,统一使用绝对路径。(在jsp中用request.getContextPath方式来拿到webapp的路径)
<a href="<%=path %>/user/userAdd">添加用户
<a href="<%=path %>/user/user!add">添加用户

前者会产生太多的action,所以不推荐使用


二、action的搜索顺序

1、获得请求路径URL 例如 http://server/struts2/path1/path2/path3/test.action

2、首选寻找/path1/path2/path3的package寻找名字为test.action,如果不存在在执行步骤3;如果存在则执行5

3、寻找namespace为/path1/path2中package,如果不存在执行步骤4 ;如果存在则执行5

4、寻找namespace为/path1的package,如果不存在则执行步骤5;如果存在则执行5

5、如果存在就会去找对应的action,如果找不到则回去默认namespace的package里面寻找(默认的命名空间为空字串"") 如果还是找不到则页面提示找不到action


三、action的默认值

1、如果没有指定class 默认是ActionSupport

2、如果没有指定method 默认是action中的execute()方法

3、如果没有指定result的name属性默认是success


三、action配置通配符

        <action name="Student*" class="com.bjsxt.struts2.action.StudentAction" method="{1}">
            <result>/Student{1}_success.jsp</result>
        </action>
        
        <action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}">
            <result>/{1}_{2}_success.jsp</result>
        </action>


四、action接收URL或者表单属性封装的三种方式

1、使用action属性接收参数 get和set方法

2、使用Domain Model接收参数

3、使用ModelDriven接收参数

参数中有中文  配置文件中加    <constant name="struts.i18n.encoding" value="GBK" /> <!-- internationalization 处理中文-->

 <constant name="struts.action.extension" value="do"></constant> 将默认的访问方式.action 改成.do

struts2加载常量的顺序

1、struts-default.xml

2、struts-plugin.xml

3、struts.xml

4、struts.properties

5、web.xml       如果多个文件都配置了同一个常量 后面会覆盖前面文件中配置的常量


取得Map类型request,session,application,真实类型 HttpServletRequest, HttpSession, ServletContext的引用:

Action1、private Map request= (Map)ActionContext.getContext().get("request");
 private Map session = ActionContext.getContext().getSession();
 private Map application = ActionContext.getContext().getApplication();

Action2、extends ActionSupport implements RequestAware,SessionAware, ApplicationAware

Action3、private HttpServletRequest request =  ServletActionContext.getRequest();
 private HttpSession session = request.getSession();
 private ServletContext application = session.getServletContext();

Action4、extends ActionSupport implements ServletRequestAware


四、数据校验

使用addFieldError方法和s:fieldError标签简单处理数据校验

if(name == null || !name.equals("admin")) {
this.addFieldError("hh", "name is error");
this.addFieldError("hh", "name is too long");
return ERROR;

<s:fielderror fieldName="hh" theme="simple"/>
<s:property value="errors.hh[0]"/>


五、返回值类型

   <action name="r1">
    <result type="dispatcher">/r1.jsp</result>
   </action>
   
   <action name="r2">
    <result type="redirect">/r2.jsp</result>
   </action>
   
   <action name="r3">
    <result type="chain">r1</result>
   </action>
   
   <action name="r4">
    <result type="redirectAction">r2</result>
   </action>


六、类型转换器


继承 StrutsTypeConverter 重写convertFromString方法 

1、局部转换器 名字必须和action名保持一致

p(属性名) = **.**.** 转换器类名

2、全局转换器 名字开头必须是xwork

**.**.** (类名) = **.**.** 转换器类名


七、文件上传

、八、自定义拦截器

实现Interceptor接口  重写intercept方法

<package name="test" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="my" class="com.bjsxt.interceptor.MyInterceptor"></interceptor>
</interceptors>
<action name="test" class="com.bjsxt.action.TestAction">
<result>/test.jsp</result>
<interceptor-ref name="my"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
</package>


九、OGNL表达式

OGNL(Object-Graph Navigation Language),大概可以理解为:对象图形化导航语言。是一种可以方便地操作对象属性的开源表达式语言。

1、“#”符号有三种用途: 

(1)、访问非根对象(struts中值栈为根对象)如OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性:   

 #request.userName相当于request.getAttribute("userName"  
(2)、用于过滤和投影(projecting)集合,如: books.{?#this.price>35  

(3)、构造Map,如: #{'foo1':'bar1''foo2':'bar2' 

#{'foo1':'bar1''foo2':'bar2'}这种方式常用在给radio或select、checkbox等标签赋值上。


2、“%”符号的用途是在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式。

3、“$”有两种用途  

(1)、在国际化资源文件中,引用OGNL表达式。

(2)、在Struts 2配置文件中,引用OGNL表达式:

<action name="saveUser" class="userAction" method="save"

    <result type="redirect">listUser.action?msg=${msg}</result>  

</action>  





【论文复现】一种基于价格弹性矩阵的居民峰谷分时电价激励策略【需求响应】(Matlab代码实现)内容概要:本文介绍了一种基于价格弹性矩阵的居民峰谷分时电价激励策略,旨在通过需求响应机制优化电力系统的负荷分布。该研究利用Matlab进行代码实现,构建了居民用电行为与电价变动之间的价格弹性模型,通过分析不同时间段电价调整对用户用电习惯的影响,设计合理的峰谷电价方案,引导用户错峰用电,从而实现电网负荷的削峰填谷,提升电力系统运行效率与稳定性。文中详细阐述了价格弹性矩阵的构建方法、优化目标函数的设计以及求解算法的实现过程,并通过仿真验证了所提策略的有效性。; 适合人群:具备一定电力系统基础知识和Matlab编程能力,从事需求响应、电价机制研究或智能电网优化等相关领域的科研人员及研究生。; 使用场景及目标:①研究居民用电行为对电价变化的响应特性;②设计并仿真基于价格弹性矩阵的峰谷分时电价激励策略;③实现需求响应下的电力负荷优化调度;④为电力公司制定科学合理的电价政策提供理论支持和技术工具。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,深入理解价格弹性建模与优化求解过程,同时可参考文中方法拓展至其他需求响应场景,如工业用户、商业楼宇等,进一步提升研究的广度与深度。
针对TC275微控制器平台,基于AUTOSAR标准的引导加载程序实现方案 本方案详细阐述了一种专为英飞凌TC275系列微控制器设计的引导加载系统。该系统严格遵循汽车开放系统架构(AUTOSAR)规范进行开发,旨在实现可靠的应用程序刷写与启动管理功能。 核心设计严格遵循AUTOSAR分层软件架构。基础软件模块(BSW)的配置与管理完全符合标准要求,确保了与不同AUTOSAR兼容工具链及软件组件的无缝集成。引导加载程序本身作为独立的软件实体,实现了与上层应用软件的完全解耦,其功能涵盖启动阶段的硬件初始化、完整性校验、程序跳转逻辑以及通过指定通信接口(如CAN或以太网)接收和验证新软件数据包。 在具体实现层面,工程代码重点处理了TC275芯片特有的多核架构与内存映射机制。代码包含了对所有必要外设驱动(如Flash存储器驱动、通信控制器驱动)的初始化与抽象层封装,并设计了严谨的故障安全机制与回滚策略,以确保在软件更新过程中出现意外中断时,系统能够恢复到已知的稳定状态。整个引导流程的设计充分考虑了时序确定性、资源占用优化以及功能安全相关需求,为汽车电子控制单元的固件维护与升级提供了符合行业标准的底层支持。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值