笔记之_java整理struts

Posted 莫轩ASL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了笔记之_java整理struts相关的知识,希望对你有一定的参考价值。

weixinAPI微信对接
Struts标签库
Xml的地址:http://blog.csdn.net/xiazdong/article/details/7293177
Struts注入优先考虑modelDirven中找,其次才是setter方法
Value注入值,ref注入对象
Jsp实时编译的,freemarker是预编译的
EL表达式只能取session、application、request的值
将String[]转换为List<String>
    Arrays.<String>alist(数组对象)
Struts中上传文件大小不得大于2mb
Struts中xml有继承的概念
拦截器方法在action执行前或之后执行,动态代理的原理,ref引用对象
Struts中没有404错误,一般为struts的异常模板,除非转发页面时没有找到页面
实现struts中action的方法:
    1.继承actionsupport
    2.实现action接口,重写String excute()方法
Struts2执行顺序:
    Struts-default---?struts-plugin--?struts.xml
使用Struts 2 开发程序的基本步骤
加载Struts2 类库
配置web.xml文件
开发视图层页面
开发控制层Action
配置struts.xml文件
部署、运行项目
struts2 动作配置
<package  name=”唯一的包” namespace=”/”  extends=”struts-default”>
     定义动作
<action  name=”虚拟地址”  class=”交给哪个类来处理” method=”哪个方法”>
           <result name=”哪个方法返回的字符串”
type=”转发dispatcher,重定向urlredirect,重定向action (redirectAction)”
>  
                  哪个页面显示
</result>
</action>
</package>

1、实现struts中的action有几种方法?
1)、  继承ActionSupport
2)、  实现Action 接口  -->重写 String execute()








2、动态调用
        作用:减少action数量
        使用:actionName!methodName.action
        禁用:将属性struts.enable.DynamicMethodInvocation设置为false
如果使用动态调用就不能使用通配符
public class UserAction implements Action{//user!login.action,调用UserAction的login()方法
        ……
        public String login(){…..}
public String register(){…..}
}
<action name="user" class="com.xxxx.web.UserAction" >
        <result name="login">/page/manage.jsp</result>
        …………
</action>
3、设定默认action,用来显示用户输入错误action地址
        配置默认Action
            没有Action匹配请求时,默认Action将被执行
            通过<default-action-ref…../>元素配置默认action
<struts>
    <default-action-ref  name=”defaultAction”/>
    <package  name=”defaultextends=”struts-default”>
        <action  name=”defaultAction”>
<result>error.jsp</result>
</action>
            </package >
<struts>

4、配置全局的结果集
    全局结果
        实现同一个包中多个action共享一个结果
<struts>
    <default-action-ref  name=”defaultAction”/>
    <package  name=”defaultextends=”struts-default”>
        <global-results>
<result  name=” error”>/error.jsp</result>
<result  name=”login”  type=”redirect”>/login.jsp</result>
</global-results>
…..省了action的配置
            </package >
<struts>




5、struts2原型图
用户请求-->ActionMapper(Action映射)-->FilterDispatcher(转发)-->ActionProxy(Action代理)
-->读取配置文件-->比对struts.xml中配置 -->ActionInvocation(Action核心调度器)
-->经过层层的(Interceptor)过滤-->执行Action中的method方法-->方法执行完后返回Result结果-->根据返回结果读取页面(Template)-->再一次经过层层(Interceptor)过滤-?响应给用户
 


6、拦截器和拦截器栈
  拦截器,只能有一个功能
    <interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>
  
  拦截器栈,  是由一个或者多个拦截器组成的一个集合  
  <interceptor-stack name="basicStack">
                <interceptor-ref name="exception"/>
                <interceptor-ref name="servletConfig"/>          
                <interceptor-ref name="deprecation"/>
  </interceptor-stack>

7、自定义拦截器
1)、继承 AbstractInterceptor
2)、重写  intercept 方法
         Invocation.invoke();  执行你定义的action中的方法
3)、在struts.xml中去配置

    <!-- 配制全局的包,让其它packet继承这个包 -->
    <package name="commonPackage" namespace="/" extends="json-default"
        abstract="true">
        <!-- 定义拦截器 -->
        <interceptors>
            <interceptor name="timeSpeend"
                class="com.wisezone.interceptor.TimeSpeedInterceptor"></interceptor>
            <!-- 定义拦截器栈,重写系统strtus-default.xml中默认的 -->
            <interceptor-stack name="myDefaultStack">
                <!-- 系统默认的 -->
                <interceptor-ref name="defaultStack"></interceptor-ref>
                <!-- 我自己的 -->
                <interceptor-ref name="timeSpeend"></interceptor-ref>
            </interceptor-stack>        </interceptors>
        <!-- 更新全局的拦截器 -->
        <default-interceptor-ref name="myDefaultStack"></default-interceptor-ref>    
    </package>

<!--约定大于配置 -->
<packagename="FlinkTypePackage" namespace="/admin" extends="commonPackage">
</package>

8、文件上传命名规则 
private File upload;                     
private String uploadContentType;
private String uploadFileName;

页面:<input  type=”file”  name=”upload”/>
9、自定义类型转换
public class DateConverter extends DefaultTypeConverter
ArrayConverter
ListConverter
DateConverter
NumberConverter
StringConverter



10、strtus2值栈
 

要访问ValueStack就必须要与struts中的标签一起用,它不能单独使用
User  (userName,password)  -->存在值栈中   private User  user;  //getter/setter方法
 <s:property   value=”user.userName” />
<s:textfield name="user.userName" id="userName"></s:textfield>
<s:password name="user.password" id="password"></s:password >
 

日期标签:
    语法:
        <s:date  format=”format”  nice =”true|false”  name=”name”  id=”id”>
            ……….
        </s:date>
        Formate属性:指定格式进行日期格式化
    
Nice属性:该属性只有true和false两个值用于指定是否输出指定日期与当前时间的时差,默认为false
        Name属性:表示当前需要格式化的日期
        Id属性:表示引用该元素的id值
11、struts2验证规则
        void  validate方法名()   对某一个动作进行验证
        void  validate()          所有的动作进行验证  ( 不会重写)
    public void saveInfo(){}
    public void validateSaveInfo(){
        if(StringUtil.isEmpty(this.flinkType.getTypeName)){
            super.addFiledError(“typeName”,”分类名称不能为空”);
}
}
12、国际化
 
13、保证新增和修改保存 唯一,不允许 重复提交
重复提交发生时机:
    1)、网络慢的时候   
    2)、提交失败了报错, 按返回上一步,再一次提交
    
    token 令牌机制
<package name="filePackage" namespace="/admin" extends="commonPackage">
        <!-- 定义一个通配查询动作 admin/admin_angular1.action -->
        <action name="file_upload" class="fileUploadTestAction" method="upload">
            <!-- 重复提交,开始token机制 -->
            <interceptor-ref name="myDefaultStack"></interceptor-ref>
            <interceptor-ref name="token"></interceptor-ref>
            <result name="success">/admin/flinktype/file.jsp</result>
            <result name="invalid.token">/admin/重复提交.jsp</result>
        </action>
    </package>
14、struts2类型转换器
struts2  TypeConvertor 博客园

15、freemarker 模板 框架
                模板     
页面:纯html  ${name}    中间:Freemarker:velocity    后台:name=”张三”
16、Freemarker的使用方法
第一步:把freemarker的jar包添加到工程中
第二步:freemarker的运行不依赖web容器,可以在java工程中运行。创建一个测试方法进行测试。
第三步:创建一个Configration对象,该对象负责管理Freemarker的模板加载路径,负责生成模板实例
第四步:告诉config对象模板文件存放的路径。
第五步:设置config的默认字符集。一般是utf-8
第六步:从config对象中获得模板对象。需要制定一个模板文件的名字。
第七步:创建模板需要的数据集。可以是一个map对象也可以是一个pojo,把模板需要的数据都放入数据集。数据模型就是一个MAP集合
第八步:创建一个Writer对象,指定生成的文件保存的路径及文件名。
第九步:调用模板对象的process方法生成静态文件。需要两个参数数据集和writer对象。
第十步:关闭writer对象。
17、
FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成:
1,文本:直接输出的部分
2,注释:<#-- ... -->格式部分,不会输出
3,插值:即${...}或#{...}格式的部分,将使用数据模型中的部分替代输出
4,FTL指令:FreeMarker指定,和HTML标记类似,名字前加#予以区分,不会输出
18、freemarker通用插值:
FreeMarker的插值有如下两种类型:1,通用插值${expr};2,数字格式化插值:#{expr}或#{expr;format}
1、通用插值
对于FreeMarker的通用插值,又可以分为以下4种情况:
1. FreeMarker插值结果为字符串值:直接输出表达式结果
2. FreeMarker插值结果为数字值:根据默认格式(由#setting指令设置)将表达式结果转换成文本输出.可以使用内建的字符串函数格式化单个插值,如下面的例子:
<#settion number_format="currency"/>
<#assign answer=42/>
${answer}
${answer?string} <#-- the same as ${answer} -->
${answer?string.number}
${answer?string.currency}
${answer?string.percent}
${answer}
输出结果是:
$42.00
$42.00
42
$42.00
4,200%
3. FreeMarker插值结果为日期值:根据默认格式(由#setting指令设置)将表达式结果转换成文本输出.可以使用内建的字符串函数格式化单个插值,如下面的例子:
${lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")}
${lastUpdated?string("EEE, MMM d, ‘‘yy")}
${lastUpdated?string("EEEE, MMMM dd, yyyy, hh:mm:ss a ‘(‘zzz‘)‘")}
输出结果是:
2008-04-08 08:08:08 Pacific Daylight Time
Tue, Apr 8, ‘03
Tuesday, April 08, 2003, 08:08:08 PM (PDT)
4. FreeMarker插值结果为布尔值:根据默认格式(由#setting指令设置)将表达式结果转换成文本输出.可以使用内建的字符串函数格式化单个插值,如下面的例子:
<#assign foo=true/>
${foo?string("yes", "no")}
输出结果是:
yes
2、数字格式化插值
关于FreeMarker数字格式化插值可采用#{expr;format}形式来格式化数字,其中format可以是:
mX:小数部分最小X位
MX:小数部分最大X位
如下面的例子:
<#assign x=2.582/>
<#assign y=4/>
#{x; M2} <#-- 输出2.58 -->
#{y; M2} <#-- 输出4 -->
#{x; m2} <#-- 输出2.6 -->
#{y; m2} <#-- 输出4.0 -->
#{x; m1M2} <#-- 输出2.58 -->
#{x; m1M2} <#-- 输出4.0 -->
3、集合
集合以方括号包括,各集合元素之间以英文逗号","分隔,看如下的例子:
<#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as x>
${x}
</#list>
输出结果是:
星期一
星期二
星期三
星期四
星期五
星期六
星期天
4、If指令
这是一个典型的分支控制指令,该指令的作用完全类似于Java语言中的if,if指令的语法格式如下:
<#if condition>...
<#elseif condition>...
<#elseif condition>...
<#else> ...
</#if>

例子如下:
<#assign age=23>
<#if (age>60)>老年人
<#elseif (age>40)>中年人
<#elseif (age>20)>青年人
<#else> 少年人
</#if>
输出结果是:青年人
4.2 switch , case , default , break指令
这些指令显然是分支指令,作用类似于Java的switch语句,switch指令的语法结构如下:
<#switch value>
<#case refValue>...<#break>
<#case refValue>...<#break>
<#default>...
</#switch>
5、字符串使用的内建函数:
html : 字符串中所有的特殊 HTML 字符都需要用实体引用来代替(比如 < 代替 &lt; )
cap_first :字符串的第一个字母变为大写形式
lower_case :字符串的小写形式
upper_case :字符串的大写形式
trim :去掉字符串首尾的空格
6、Struts2解析FreeMarker模板中变量的顺序如下: 
1,FreeMarker模板内建的变量;
2,ValueStack中的变量;
3,ActionContext中的变量;
4,HttpServletRequest中的属性;
5,HttpSession中的属性;
6,ServletContext范围的属性. 







type 所有类型:(在struts2-core.jar/struts-default.xml中)
Type 类型值        作用说明    
chain            用来处理Action 链
dispatcher(默认值)    用来转向页面,通常处理JSP
redirect        重定向到一个URL
redirectAction        重定向到一个 Action
plainText        显示源文件内容,如文件源码
freemarker        处理 FreeMarker 模板
httpheader        控制特殊 http 行为的结果类型
stream            向浏览器发送 InputSream 对象,
通常用来处理文件下载,还可用于返回 AJAX 数据
velocity        处理 Velocity 模板
xslt               处理 XML/XLST 模板
Struts在值栈:
<action name="paymentmanagement/*_*" class="{1}Action" method="{2}">
               <interceptor-ref name="modelDriven">
                    <param name="refreshModelBeforeResult">true</param>
             </interceptor-ref> 
             <interceptor-ref name="defaultStack"></interceptor-ref> 
           <result name="{2}" type="freemarker">/WEB-INF/admin/paymentmanagement/{1}_{2}.html</result> 
       </action>

 

以上是关于笔记之_java整理struts的主要内容,如果未能解决你的问题,请参考以下文章

笔记之_java整理设计模式

[原创]java WEB学习笔记61:Struts2学习之路--通用标签 property,uri,param,set,push,if-else,itertor,sort,date,a标签等(代码片段

笔记之_java窗体程序整理

笔记之_Java基础整理

笔记之_Java的JDBC整理

笔记之_java整理框架