笔记之_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=”default”  extends=”struts-default”>
        <action  name=”defaultAction”>
<result>error.jsp</result>
</action>
            </package >
<struts>

4、配置全局的结果集
    全局结果
        实现同一个包中多个action共享一个结果
<struts>
    <default-action-ref  name=”defaultAction”/>
    <package  name=”default”  extends=”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>
时间: 2024-10-09 20:08:29

笔记之_java整理struts的相关文章

笔记之_java整理hibernate

页面调试数据: <%@taglib uri="/struts-tags" prefix="s" %> <s:debug></s:debug> Js清除缓存 使用hibernate延迟加载时,并且数据库有关联关系,转换成json对象时不能直接转换,要用new JSONObject(),然后put()方法存值 国外框架项目地址:http://websystique.com/springmvc/spring-mvc-4-angularj

笔记之_Java整理Spring MVC

springMVC原理讲解地址:http://www.cnblogs.com/dragonfei/p/6148625.html Ionic2和angularjs2和angularjs和nosql菜鸟教程一起是做手机的 https://www.bilibili.com/video/av8614724/index_10.html是ionic2公开课地址 FreeCMS DeDeCMS风信网,数据库表结构 DEDECMS简单建站 Filter和Interceptor的区别 Filter是基于函数回调的

笔记之_Java整理freemarker

javascript的input标签中this.select()表示选中,return false;表示什么都不做 freemarker中input中!为空格, !1表示默认为1 jquery的cookie event.keycode==13表示按下了回车键 freemarker宏定义 1.FreeMarker模板的内建变量有如下几个: 1,stack:代表ValueStack本身,可通过如下方式来访问其中的变量"${stack.findString('ognl?expr')}" 2,

笔记之_Java整理IO流

线程重复执行: ScheduledExecutorService exec = Executors.newScheduledThreadPool(1); exec.scheduleAtFixedRate(线程名, 1, 1, TimeUnit.SECONDS); 字符输出流writer写完后要执行flush()方法,不然内容不存在 IO流:实时交互 Socket网络交互 多线程和socket合为一体 所有软件几乎都会有多线程,所有跟网络有关的必须要使用socket 大多数的程序只能循环运行单独的

笔记之_java整理html5

查看手机唯一标识:http://html5plus.org/doc/zh_cn/device.html#plus.device.uuid html和html5的区别? html5+css3也逐渐的成为新一代web前端技术,最要用处在开发手机网站. 文档网站:http://www.w3school.com.cn/html5/index.asp HTML5的新功能 (1).强大的绘图功能 (2).新增音频/视频标签 (3).浏览器离线存储 (4).通过浏览器进行定位 外网连接局域网的项目:花生壳?内

笔记之_java整理框架

This依赖于对象,static依赖于类 字符串的模糊查询: instr(empName,?)>0 empName like '%白%' Create view 表名 as 多表连接 视图是临时表 多表连接语句生成,查询工具点开 <T,K>泛型可以用多个 ResultSetMetaData取得列名集合,rst.getMetaData Reflect反射,Field[] 实例化对象方法: New student(); Student.class.newInstance(); Class.f

笔记之_java整理JavaScript

1.javascript 面向对象这一块 1). javascript的基本数据类型有哪些? Number (数字) 1 1.2 String (字符串) '' "" Boolean 布尔 true false Undefined 未定义 Null 空 2).javascript的引用数据类型有哪些? Object {}. 函数 function . 数组 [] 2.javascript定义对象,动态扩冲里面的变量或者属性 var a =new Object(); //实例化一个对象

笔记之_java整理kindeditor文件上传插件

下载插件压缩包 图片创建虚拟服务器路径: 在Tomcat中,打开Tomcat的系统文件夹servers,打开下面的server.xml, 在<Context docBase="class" path="/class"--/>标签中,修改绝对路径docBase和虚拟路径path ,绝对路径是磁盘上创建的保存图片的文件夹,虚拟路径是网页访问图片的路径, 根据自己要用的上传文件的类型,选择插件的相关案例,引用css.js,修改路径以及页面类型jsp.php,

笔记之_Java整理css3

微传单:http://s.wcd.im/index.jsp?id=9661Zi9&flyerAid=9661&p&loading=0&fromOfficial Friendly同包访问 子类重写方法的修饰符必须大于等于子类定义好的访问修饰符 类是抽象的对象是现实存在的 局部变量必须先赋值才能使用 一个Java文件可以包含n个类智能有一个是public并且与文件名一致 接口继承接口,方法名相同不是重写是覆盖 实现接口的类不是抽象类,则必须实现接口及其父级接口的所有方法 Str