zoukankan      html  css  js  c++  java
  • 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>

     

  • 相关阅读:
    BRAFT EDITOR富文本编辑器
    小程序
    单元测试之道读书笔记(二)
    单元测试之道读书笔记(一)
    Blend学习网址
    2014年要读的10本书
    程序员一生必读的书籍
    WPF中PasswordBox控件无法绑定Password属性解决办法
    异步方式向WPF ListBox控件中一条一条添加记录
    10中适合编程的字体
  • 原文地址:https://www.cnblogs.com/fanszone/p/2990168.html
Copyright © 2011-2022 走看看