一些struts的基础知识
凡是名字是success的result都可以不写。
目录
1、Struts1的action是和具体的Struts环境是要绑定的,是离不开servlet环境,但是Struts2只要一个普通java类就可以。 想要对这个类专门做测试,写个小测试文件,直接测里面方法就可以了。 2、Struts1每次访问的时候很可能用的是同一个action,Struts2是每次访问必定new一个。
1、普通的java类,里面有public Striing execute()方法即可; 2、实现Action接口; 3、从ActionSupport继承(最常用),好处在于可以直接使用Struts2封装好的方法。
struts2中的路径问题是根据action的路径而不是jsp路径来确定,所以尽量不要使用相对路径。虽然可以用redirect方式解决,但redirect方式并非必要。解决办法非常简单,统一使用绝对路径。(在jsp中用request.getContextRoot方式来拿到webapp的路径)或者使用myeclipse经常用的,指定basePath
<% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> 或直接指定这句话:<base href="<%=basePath%>"> 这样下面引用的地址就会自动在前面加上basePath指定的路径。
一般只用:动态方法调用DMI
4.Struts2配置:使用通配符,将配置量降到最低,不过,一定要遵守“约定优于配置“的原则。
result默认的类型是dispatcher,就是运用服务器跳转,也就是jspforward。
凡是forward的过程,这几个action共享同一个值栈。
1 <package name="user" namespace="/user" extends="struts-default"> 2 <global-results> 3 <result name="mainpage">/main.jsp</result> 4 </global-results> 5 </package> 6 7 <package name="admin" namespace="/admin" extends="user"> 8 <action name="admin" class="com.bjsxt.struts2.user.action.AdminAction"> 9 <result>/admin.jsp</result> 10 </action> 11 </package>
设置 error.jsp(404)页面
1 <global-results> 2 <result name="error">/error.jsp</result> 3 </global-results> 4 <global-exception-mappings> 5 <exception-mapping result="error" exception="java.lang.Exception"></exception-mapping> 6 </global-exception-mappings> 7 <!-- 全局的异常处理,results要在exception前面 --> 8 9 <exception-mapping result="error" exception="java.sql.SQLException" /> <result name="error">/error.jsp</result>
动态结果DynamicResult
struts.xml:
<package name="user" namespace="/user" extends="struts-default"> <action name="user" class="com.bjsxt.struts2.user.action.UserAction"> <result>${r}</result> </action> </package>
UserAction.java:
1 public class UserAction extends ActionSupport { 2 private String r ; 3 private String type ; 4 5 public String execute() throws Exception { 6 if(type == 1) r="/user_success.jsp"; 7 else if (type == 2) r="/user_error.jsp"; 8 return "success"; 9 } 10 11 public String getR() { 12 return r ; 13 } 14 public void setR(String r) { 15 this.r = r ; 16 } 17 public String getType() { 18 return type ; 19 } 20 public void setType(String r) { 21 this.type = type ; 22 } 23 }
5.Struts2配置文件:用通配符,先匹配最精确的,只要包括*号的都是同一等级,这时候就按前后顺序了,谁放前面调谁的。
如果是在1.5里面,实现一接口,在实现的方法上面是不能写@Override的,1.6就可以。
VO:valueObject, DO:dataObject, DTO:dataTransferObject
7.Action接收参数的三种方法: 1、Action的属性接收, 2、DomainModel接收, 3、ModelDriven接收。
如果传输的参数有中文,尽量的不要用get,全部用post是可以做到的。
8.Struts2的常用配置在:struts2-core-2.2.1.1.jar/org.apache.struts2/default.properties
9.国际化:internationalization,i和n之间总共有18个字母,所以叫i18n,整个单词是20个字母。
10.struts.xml里面包含其他xml配置: <include file="login.xml" />,东西比较简单,意义比较大,分模块,各个开发人员独立配置,最后用包含整合到一起。
11.OGNL:对象图导航语言OGNL学习(Object Graph Navigation Language) (Struts2_1900_OGNL):
访问静态方法:<s:property value="@com.ob.struts2.ognl.S@s()"/>;
访问静态属性:<s:property value="@com.ob.struts2.ognl.S@STR"/>;
访问Math类的静态方法:<s:property value="@@max(2,3)" />。
struts2的标签:凡是Object的类型,它都会把里边的字符串解析为ognl表达式。<s:property value="'username'"/>
struts2的set标签,用来换名的地方比较多,其他用的不多。
<s:include value="%{#incPage}"></s:include> 这里的%{}表示请你强制的把里面的内容不要当成字符串,把它当成ognl表达式。 不谦麻烦的话,可以给所有的都加上%{},全给转成ognl表达式。
<s:property value="username"/>(<s:property>指的是标签,OGNL表达式指的是value里边的内容如:username这一部分的内容。)
user.xxx只有传,才会构造,想初始化domain model,可以自己new,也可以传参数值,但这时候需要保持参数为空的构造方法。
12.$#%的区别: 1、$用于i18n和struts配置文件, 2、#取得ActionContext的值, 3、%将原本的文本属性解析为ognl,对于本来就是的ognl的属性不起作用。
<s:include>不建议用,2.0处理中文有问题,2.1有时间得试试。 struts2包含的中文问题<s:include>,是要在头部加上<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">这一句,里面的charset一定要设为UTF-8才行,用GB18030是不行的。
13.Struts2里的UI标签里面有四个主题:simple、xhtml(默认)、css、xhtml ajax
定义自己的theme: 1、css(覆盖struts2原来的css), 2、覆盖单个文件, 3、定义自己的theme, 4、实战: a)把所有主题 定义为simple, b)fielderror特殊处理, c)自己控制其他标签的展现。
14.声明式异常处理: 1、在Action中进行异常映射 2、在package中进行全局异常映射 3、使用继承共用异常映射 4、struts2中异常处理由拦截器实现(观察struts-default.xml) a)、实际上struts2的大多数功能都由拦截器实现
1、ResourceBundle和Locale的概念 2、资源文件 3、native2ascii Struts的资源文件: a) Action-Package-App级 b) PropertiesEditor插件
i18n动态语言参数,只要传一个参数就可以: request_locale=en_us或request_locale=zh_cn
- 国际化分action-package-app级别,一般只做 package 级别的国际化:
- action下的国际化只需将properties文件设置为: 相应的action名_ zh_CN.properties、相应的action名_en_US.properties
1 <form action="admin/Login-login" method="post"> 2 <s:property value="getText('login.username')"/> 3 <input name="username" /> 4 <s:property value="getText('login.password')"/> 5 <input name="password" type="password" /> 6 <input type="submit" value="<s:property value="getText('login.login')"/>" /> 7 </form>
-->新建文件:bbs2009_en_US.properties、bbs2009_zh_CN.properties(本例中bbs2009与struts.xml文件中的配置对应)
request、session、application对象的定义和获取:
1 private HttpServletRequest request; 2 private HttpSession session; 3 private ServletContext application; 4 5 request = ServletActionContext.getRequest(); 6 session = request.getSession(); 7 application = session.getServletContext();
数据库的命名,一般约定好表的名字,字段的名字,一般还有库名(项目名称)就可以了。用层来划分包!
查看ActionSupport.java的方法:
直接调方法只能针对Action的方法来调。
专门做安全的一种框架:acegi - spring security(现在改名了,叫spring的安全框架)
<s:a>标签,此时,请求名称必须加后缀.action
<package>元素(包) 当struts.xml文件比较长时,用<package>元素把相关的内容分成块,利于对文件的维护,一个<package>中可以有多个Action的配置。
用包名name区分不同的包。
命名空间namespace属性在包的基础上,进一步组织Action,当有多个package时,即时不同名packag中有同名的Action,只要namespace不同,系统调用Action 时,通过命名空间名称的区分,是能找到正确的Action的。
1 <package name="struts-hello" extends="struts-default" namespace="/test"> <action name="hello" class="com.struts2.hello.HelloAction"> <result name="success">hello.jsp</result> </action> </package>
当指定了namespace名后,返回结果页面要放在与命名空间同名的文件夹中,如上例,系统寻找hello.jsp时自动回就加上命名空间前缀,即:实际是在WebRoot下的test文件夹中找hello.jsp页面。
如果hello.jsp页面放在WebRoot下,则配置中要加“/”,即:
<package name="struts-hello" extends="struts-default" namespace="/test"> <action name="hello" class="com.struts2.hello.HelloAction"> <result name="success">/hello.jsp</result> </action> </package>