Struts2学习

一些struts的基础知识

凡是名字是success的result都可以不写。

  目录

  1.Struts1和Struts2的很大一个区别:

1、Struts1的action是和具体的Struts环境是要绑定的,是离不开servlet环境,但是Struts2只要一个普通java类就可以。 想要对这个类专门做测试,写个小测试文件,直接测里面方法就可以了。 2、Struts1每次访问的时候很可能用的是同一个action,Struts2是每次访问必定new一个。

  2.具体Action的实现有三种方法:

1、普通的java类,里面有public Striing execute()方法即可; 2、实现Action接口; 3、从ActionSupport继承(最常用),好处在于可以直接使用Struts2封装好的方法。

  3.路径问题:

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共享同一个值栈。

  在struts.xml中设置指定默认action:
<package name="default" namespace="/" extends="struts-default">
    <default-action-ref name="index"></default-action-ref>
    <action name="index">
    <result>/default.jsp</result>
    </action>
</package>
 
   关于action中resultTypes的说明:
Demo:(Ps: type还可以是freemarker、httpheader、stream、velocity、xslt、plaintext、tiles)
<package name="resultTypes" namespace="/r" extends="struts-default">
    <action name="r1">
    <result type="dispatcher">/r1.jsp</result>     //default,执行action后路径变为:你的项目在服务器中的路径/r/r1
    </action>
    <action name="r2">
    <result type="redirect">/r2.jsp</result>    //执行action后路径变为:你的项目在服务器中的路径/r2.jsp
    </action>
    <action name="r3">
    <result type="chain">r1</result>         //action执行r3跳到r1,action后路径变为:你的项目在服务器中的路径/r/r3
    </action>
    <action name="r4">
    <result type="redirectAction">r2</result>        //执行action后路径变为:你的项目在服务器中的路径/r2.jsp
    </action>
</package>
 
  若想在当前package中使用另一package的result,只需将其设置为GlobalResult
 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:

View Code
<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

View Code
 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配置文件:用通配符,先匹配最精确的,只要包括*号的都是同一等级,这时候就按前后顺序了,谁放前面调谁的。

  6.JDK1.5和1.6区别之一:

如果是在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的大多数功能都由拦截器实现

  15.I18N原理: 

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
package 下的国际化只需将properties文件统一设置为:  package_ zh_CN.properties、 package_en_US.properties
-->新建 jsp 文件
  
View Code
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文件中的配置对应)

                
-->配置struts.xml文件
<constant name="struts.custom.i18n.resources" value="bbs2009"></constant>
 
显示结果如下(默认语言为[zh-CN]):                               当把浏览器的语言设置为[en-US]后                                                 结果变为:      
                                      

  16.其他小知识点

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的方法:

    1.找到需要导入源码的jar包,右键--Properties
    2.导入源码路径    C:/Users/FanSZone/Desktop/struts-2.3.8/src/xwork-core/src/main/java
 
xml文件中添加本地dtd的方法:
    Windows-->Properties-->XML Catalog-->add:
    Location:lib-->struts2-core-2.3.8-->struts-2.3.dtd
    keyType: URI
 
关联相应类的docs文档:
     1.找到需要查看docs文档的jar包,右键--Properties
     2.Javadoc Location:
        path: E:/struts/software/struts-2.3.8/docs/struts2-core/apidocs/
 
this.addFieldError("name", "name is error");
<s:fielderror fieldName="name" theme="simple"/>
 
调出栈<s:debug></s:debug>

直接调方法只能针对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>

 

原文地址:https://www.cnblogs.com/fanszone/p/2990168.html