企业是做网站还是做微信,室内设计师常用网站,如何开淘宝店并运营店铺,网站建设开发图片第一节、MVC以及Struts2简介 第二节、Action生命周期以及接收表单数据 第三节、Struts2配置以及Struts.xml详解 Struts2 主要配置文件 Web.xml 设置过滤器以及annotation初始化参数
Struts.xml 主配置文件
Struts.properties 默认属性文件
Struts-default.xml 默认配置文件… 第一节、MVC以及Struts2简介 第二节、Action生命周期以及接收表单数据 第三节、Struts2配置以及Struts.xml详解 Struts2 主要配置文件 Web.xml 设置过滤器以及annotation初始化参数
Struts.xml 主配置文件
Struts.properties 默认属性文件
Struts-default.xml 默认配置文件
Struts-plugin.xml 插件配置文件 Struts2 主要配置加载次序 由上至下以此为
Struts-default.xml
Struts-plugin.xml
Struts.xml
Struts.properties
Web.xml
如果在多个文件中配置了同一个Struts2常量则后一个文件中的配置的常量值将覆盖前面文件中配置的常量值。在不同文件中配置常量的方式是不一样的但不管哪个文件中配置Struts2常量都要指定两个属性常量name和常量value
推荐在struts.xml文件中配置Struts2常量 Struts-default.xml 配置信息 Bean元素属性
class必选指定了Bean实例的实现类
type可选通常是通过某个接口或者在此前定一个过的Bean
name可选它指定的Bean实例的名字对于有相同type的多个Beanname必须唯一
scope可选指定Bean的作用域只能是default、singleton、request、session和thread之一
static可选它指定Bean是否使用静态方法注入。通常而言当指定了type属性时该属性就不应该设置为true
optional可选指定Bean是否是一个可选Bean default.properties 默认属性信息 ##字符集
struts.i18n.encodingUTF-8
struts.objectFactory.spring.autoWire name
struts.objectFactory.spring.useClassCache true
struts.objectFactory.spring.autoWire.alwaysRespect false
struts.multipart.parserjakartastruts.multipart.saveDirstruts.multipart.maxSize2097152
##请求后缀
struts.action.extensionaction,,
struts.serve.statictrue
struts.serve.static.browserCachetrue
struts.enable.DynamicMethodInvocation false
struts.enable.SlashesInActionNames false
struts.mapper.action.prefix.enabled false
struts.mapper.action.prefix.crossNamespaces false
struts.tag.altSyntaxtrue
##开发模式
struts.devMode false
struts.i18n.reloadfalse
struts.ui.themexhtmlstruts.ui.templateDirtemplate
struts.ui.theme.expansion.token~~~struts.ui.templateSuffixftl
struts.configuration.xml.reloadfalse
struts.velocity.configfile velocity.properties
struts.velocity.contexts
struts.velocity.toolboxlocation
struts.url.http.port 80struts.url.https.port 443
struts.url.includeParams none
struts.dispatcher.parametersWorkaround false
struts.freemarker.templatesCachefalse
struts.freemarker.beanwrapperCachefalse
struts.freemarker.wrapper.altMaptrue
struts.freemarker.mru.max.strong.size0
struts.xslt.nocachefalse
struts.mapper.alwaysSelectFullNamespacefalse
struts.ognl.allowStaticMethodAccessfalse
struts.el.throwExceptionOnFailurefalse
struts.ognl.logMissingPropertiesfalse
struts.ognl.enableExpressionCachetrue
struts.handle.exceptiontrue Struts.xml 配置信息 struts !--重置属性— constant namestruts.devMode valuetrue /constant constant namestruts.i18n.encoding valueurf-8/constant !--定义包— package namedefault namespace/ extendstruts-default !--动作— action name class result name class /result /action /package
/struts Constant 常量
Package 包 解决Action重名方便继承 -name 包名 -extends 父包名 -namespace 命名空间
Action -name 动作名 -class 实现类
global-results 全局结果
Result 局部结果 第四节、Action 高级 method 属性 action nameadmin classnet.nw.action.AdminAction methodadd resultresult.jsp/result
/action DMI动态方法调用 action nameadmin classnet.nw.action.AdminAction resultresult.jsp/result
/action
a href%path%/admin/admin!add.action添加/a Forword Action(页面跳转) 默认Action default-action-ref nameerror/default-action-ref
action nameerrorresulterror.jsp/result
/action 通配符映射 action nameStudent* classnet.nw.struts2.action.StudentAction method{1}result/Student{1}_success.jsp/result
/action{0} 表示匹配所有内容
{1} 表示前面的第一个*的内容
* 0-N不包括 /
** 0-N包括 /
\ 转义符 Zero Configuration (Annotation配置) 引入struts2-convention-plugin-2.2.1.jar包 //web.xml
filter……init-paramparam-nameactionPackages/param-nameparam-valuenet.nw.action/param-value/init-paraminit-paramparam-nameencoding/param-nameparam-valueUTF-8/param-value/init-param
/filter //注解
parentPackage(valuestruts-default)
Namespace(value/)
Result(namelogin_success,location/login_success.jsp)
Results({
Result(namelogin_success,location/login_success.jsp,typeredirect),
Result(namelogin_failure,location/login_failure.jsp,typeredirect)
}) 包含模块 include fileadmin.xml 出错页面 action name**resulterror.jsp/result
/action 第五节、访问Web元素以及Result类型 Action访问web对象四种方式 1.创建request,session,application Map对象 Map request (Map)ActionContext.getContext().get(request);
Map session ActionContext.getContext().getsession();
Map application ActionContext.getContext().getApplication(); 2.实现RequestAware,SessionAware,ApplicationAware接口 Map对象常用 3.创建传统的HttpServletRequest、HttpSession、ServletContext对象 HttpServletReques request ServletActionContext.getRequest();
HttpSession session request.getSession();
ServletContext application session.getServletContext(); 4.实现ServletRequestAware、ServletContextAware接口 Result类型 Dispatcher转发到URL通常是JSP(服务器)
Redirect重定向到URL通常是JSP(客户端)
Chain转发到一个Action服务器
redirectAction重定向到一个Action客户端
freemarker处理FreeMarker模型
Httpheader控制特殊HTTP行为的结果类型
Stream向浏览器发送InputSream对象通常用来处理文件下载还可用于返回AJAX数据
Velocity处理Velocity模版
Xslt处理XML/XLST模版
plainText显示原始文件内容例如文件源代码 第六节、Validation框架和i18n Exception异常处理 global-resultsresult name error /error.jsp/result
/global-results
global-exception-mappingsexception-mapping resulterror exceptionjava.lang.Exception/exception
/global-exception-mappings Validation框架 分为validate() / XML / Annotation 三种方式 重写validate() 方法验证action中所有的方法。
Override
public void validate(){if(! false){this.addFieldError(validate_error,验证错误);}super.validate();
} 编写ActionName-validation.xml验证action中所有的方法。
//Login-validation.xml
!DOCTYPE validators PUBLIC -//Apache Struts//XWork Validator 1.0.3//ENhttp://struts.apache.org/dtds/xwork-validator-1.0.3.dtd
validatorsfield nameusernamefield-validator typerequiredstringmessage用户名不能为空/message/field-validatorfield-validator typeemailmessage用户名必须为邮箱格式/message/field-validator/fieldfield namepasswordfield-validator typerequiredstringmessage密码不能为空/message/field-validatorfield-validator typestringlengthparam nameminLength6/paramparam namemaxLength20/parammessage密码长度必须在 ${min} ~ ${max}之间/message/field-validator/field
/validators validateMethodName() 验证指定方法
//User.java
public void validateLogin(){if(! false){this.addFieldError(validate_error,验证错误);}
} Struts.xml配置 验证指定方法
//User.java
Override
public void validate(){if(! false){this.addFieldError(validate_error,验证错误);}super.validate();
}
//Struts.xml
actioninterceptor namedefaultStackparam namevalidation.includeMethodsadd/param/interceptor
/action Annotation注解
Action(interceptorRefsInterceptorRef(valuedefaultStack,params{validation.includeMethod},add)) SkipValidation (推荐) 出错信息
s:filederror cssStylecolor:red / i18n i18n:Internationalization 国际化 L10n:localization 本地化 创建资源文件包名_语言_国家.properties
App_en_US.properties
App_zn_CN.properties Struts.xml加载属性文件
constant namestruts.custom.i18n.resources valueAPP/constant //.html
a href%path%/language.action?request_localen_US英文/a
s.property valuegetText(label.username) / //Validation.xml
message
${getText(login.field.isnull,{getText(label.username)})}
/message 第七节、OGNL一 OGNL简介 OGNL 是 Object-Graph Navigation Language 的缩写它是一种功能强大的表达式语言Expression Language简称EL通过它简单一致的表达式语法可以存储对象的任意属性调用对象的方法遍历整个对象的结构图实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。 对象导航图 方法调用 普通方法 //java
public String method(){return aaaaa;
}
//jsp
s:property valueobj.method() / Action普通方法 //jsp
s:property valuemethod() / 静态方法 //struts.xml
constant namestruts.ognl.allowStaticMethodAcces valuetrue/constant
//jsp
s:property valuepackage.ActionNamemethod() / 静态属性注意必须是public //java
public static Int num 123;
//jsp
s:property valuepackage.ActionNamenum / 构造方法 s:property valuenew package.construct() / 系统Math方法 s:property valuerandom() / 系统其他类方法 s:property valuejava.util.CalendargetInstance() / 集合对象 List有序可重复 Set无序不可重复 Map键值对 获取集合长度 list.size(); //java
private ListString aaa new ArrayListString();
private SetString bbb new HashSetString();
private MapInterget,String ccc new HashMapinterger String();
public construct()
{aaa.add(aaaaaa);bbb.add(bbbbbb);ccc.put(1,ccc);
}
//jsp
s:property valueaaa / !---List 集合 -
s:property valueaaa[0] / !---List 集合对象 -
s:property valueaaa.{attr} / !---List 集合属性 -
s:property valueaaa.{attr}.[0] / !---List 集合属性 -
s:property valuebbb / !---Set 集合 -
s:property valuebbb[0] / !---Set 集合对象 -
s:property valueccc / !---Map 集合 -
s:property valueccc[1] / !---Map 集合对象 -
s:property valueccc.keys / !---Map 集合中key对象 -
s:property valueccc.values / !---Map 集合中values对象 -
s:property valueccc.size() / !---Map 集合中的长度 - 第八节、OGNL二 投影和选择 #this 当前? 所有^ 第一个$ 最后一个 //java
private ListStudents stus new ArrayListStudents();
public construct()
{stus.add(new Students(张三18));stus.add(new Students(李四28));stus.add(new Students(王五38));
}
//jsp
s:property valuestus.{?#this.age30}.{name} /
s:property valuestus.{^#this.age30}.{name} /
s:property valuestus.{$#this.age30}.{name} / #符号的使用 访问根对象 Struts2 中值栈为根对象如ODNL上下文和Action上下文#相当于ActionContext.getContext(); 下面是几个ActionContext中有用的属性 #parameters URL地址参数#request 请求参数#session SESSION参数#application#attr 用于按request session application 顺序访问其属性attribute 用于选择和投影 构造Map #{foo1:bar1,foo2:bar2} $符号的使用 用于在国际化资源文件中引用OGNL表达式 在Struts 2 配置文件中引用OGNL表达式不推荐 值栈 Struts2 为每一次请求生成一个值栈不同的请求对应不同的值栈 Struts2 接收到一个action请求首先创建Action类的实例对象把该对象压进值栈。此时action中的所有属性都是默认值。然后执行定义该action上的所有拦截器最后执行action动作。Action构造方法-拦截器-动作方法注意拦截器可以改变属性的值当改变某个属性值后Action类的相应属性值就会变成在拦截器中最后改变该属性的这个值。 两个action之间采用的是服务器跳转如果两个action有名字相同的属性则对后一个属性的修改是否会覆盖前一个action的属性。分以下两种情况 如果具体相同名字的属性是引用类型则会覆盖。 如果具体相同名字的属性是基本类型则不会覆盖。 将对象压入值栈 ActionContext.getContext().getValueStack().push(obj); 访问值栈中的对象 [0].attr //从值栈第一个对象开始寻找
[1].method() //从值栈第二个对象开始寻找 s:property value[0] /
s:property value[1] /
s:property value[2] / 第九节、Interceptor拦截器 拦截器原理 拦截器Interceptor 是Struts2框架的核心Struts2中包括解析请求参数、将请求参数赋值给Action属性、执行数据校验、文件上传等工作都是通过拦截器实现的Struts2设计的灵巧性更大程度地得益于拦截器设计当需要扩展Struts2功能时只需要提供对应拦截器并将它配置在Struts2容器中即可如果不需要该功能时也只需要取消该拦截器的配置即可。 Struts2 内建了大量的拦截器这些拦截器以name-class对的形式配置在struts-default.xml文件中其中name是拦截器的名字就是以后使用该拦截器的唯一标识class则指定了该拦截器的实现类如果我们定义的package继承了Struts2的默认struts-default包则可以自由使用下面定义的拦截器否则必须自己定义这些拦截器。 常见的内置拦截器 chain服务器内部跳转 execAndWait等待执行拦截器 fileUpload文件上传拦截器 timer统计动作执行时间 token表单令牌 token-session表单令牌会话 拦截器与过滤器的区别 拦截器拦截的是动作(action)过滤器过滤的是请求(request)过滤器一般映射为 /* ,过滤所有请求。 拦截器是基于java反射机制的而过滤器是基于函数回调的。 过滤器依赖于servlet容器而拦截器不依赖于servlet容器。 拦截器可以访问Action上下文、值栈里的对象而过滤器不能。 在Action的生命周期中拦截器可以多次调用而过滤器只能在容器初始化时被调用一次。 自定义拦截器 实现Interceptor接口(不推荐) 继承AbstractInterceptor抽象类对所有方法进行拦截 //java
class demoInterceptor extents AbstractInterceptor{Overridepublic String intercept(ActionInvocation invocation) throws Exception{//拦截之前String result invocation.invokde();//拦截之后return result;}
}
//struts.xml
package namedefault namespace/ extendsstruts-defaultinteroeptorsinterceptor namedemoInterceptor classpackage.demoInterceptor /intorceptor-stack namemydefaultStackinterceptor-rel namedemoInterceptor /interceptor-relinterceptor-rel namedefaultStack /interceptor-rel/intorceptor-stack/interoeptors
/package
package nameuser namespace/user extendsdefaultaction namelogin classpackage.UserActioninterceptor-rel namemydefaultStack /interceptor-rel/action
/package MethodFilterInterceptor对指定方法进行拦截 //java
class demoInterceptor extents MethodFilterInterceptor{Overridepublic String doIntercept(ActionInvocation invocation) throws Exception{//拦截之前String result invocation.invokde();//拦截之后return result;}
}
//struts.xml
package namedefault namespace/ extendsstruts-defaultinteroeptorsinterceptor namedemoInterceptor classpackage.demoInterceptor /intorceptor-stack namemydefaultStackinterceptor-rel namedemoInterceptor param nameexcludeMethodsexcludeFun/param/interceptor-relinterceptor-rel namedefaultStack /interceptor-rel/intorceptor-stack/interoeptors
/package
!--另一种方式--
package nameuser namespace/user extendsdefaultaction namelogin classpackage.UserActioninterceptor-rel namemydefaultStack param namedemoInterceptor.excludeMethodsexcludeFun/paramparam namedemoInterceptor.includeMethodsincludeFun/param/interceptor-rel/action
/package PreResultListener 监听器 在返回结果集之前执行的方法 //java
class BeforeResultInterceptor extents PreResultListener{public void beforeResult(ActionInvocation invocation,String str){//返回结果集之前执行}
}
class demoInterceptor extents MethodFilterInterceptor{Overridepublic String doIntercept(ActionInvocation invocation) throws Exception{invocation.addPreResultListener(new BeforeResultInterceptor());//拦截之前String result invocation.invokde();//拦截之后return result;}
} 使用拦截器解决表单重复提交 //struts.xml
interceptor-ref nametoken!-- 显示重复提交出错页面--
/interceptor-ref
interceptor-ref nametokenSession!-- 显示重复提交成功页面但不执行重复提交动作--
/interceptor-ref
result nameinvalid.token/tokenerror.jsp/result
//jsp
s:token/s:token 第十节、UI表单标签 第十一节、OtherTag和类型转换 第十二节、FileUpload组件 第十三节、页面圆形和Tiles布局 第十四节、数据建模和用例分析 第十五节、验证码以及权限管理 第十六节、分页 转载于:https://www.cnblogs.com/linzhenjie/p/3704674.html