当前位置:首页 > 开发 > IT生活 > 正文

一些笔记

发表于: 2012-03-15   作者:coollyj   来源:转载   浏览:
摘要:   工作笔记 一、   Sbeclient_demo   1)   struts配置 struts.xml  位置/src/main/resources <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts
 

工作笔记

一、   Sbeclient_demo  

1)   struts配置 struts.xml  位置/src/main/resources

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

        "http://struts.apache.org/dtds/struts-2.1.dtd">

<struts>

    <!-- Constants -->

    <constant name="struts.devMode" value="false"/>  <!-- 属性设置Struts 2应用是否使用开发模式开发模式更利于调试 -->

    <constant name="struts.i18n.encoding" value="UTF-8"/><!--指定Web应用的默认编码集,相当于调用HttpServletRequestsetCharacterEncoding方法 -->

    <constant name="struts.action.extension" value="action"/><!-- 该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts2处理。

如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开 -->

    <constant name="struts.objectFactory" value="struts"/><!--spring 托管 -->

    <!-- xwork/struts -->

 

    <constant name="struts.custom.i18n.resources" value="messages"/><!-- 设置要加载的国际化资源文件,以逗号分隔. -->

    <constant name="struts.multipart.maxSize" value="102400000"/><!-- 指定上传文件时的临时目录大小 -->

    <constant name="struts.codebehind.pathPrefix" value="/"/><!-- xwork/struts -->

    <constant name="struts.configuration.xml.reload" value="false"/><!-- 设置当struts.xml文件改动时,是否重新加载 -->

    <!-- Include Struts defaults -->

   <!-- struts.xml文件分成多个配置文件,然后在struts.xml文件中使用<include>标签引用这些配置文件  struts-default.xml是系统的内置的配置文件,其中包含了很多的内置的拦截器的定义 -->

    <include file="struts-default.xml"/>

    <include file="struts-plugin.xml"/>

    <!-- Configuration for the default package. extends="struts-default" -->

    <package name="default" extends="json-default">

<!--本处只定义了一个defaultStack拦截器  interceptor-stack是一堆拦截器组成的一个拦截器栈。也可以当拦截器使用.interceptor-ref是指定某个action使用哪一个拦截器,可以是一个interceptor,也可以是一个interceptor-stack也可以自定义拦截器  需要AbstractInterceptor    param 指定拦截的方法可以参考 http://www.iteye.com/problems/62435-->

        <interceptors> 

            <interceptor-stack name="defaultStack">

                <interceptor-ref name="exception"/>

                <interceptor-ref name="alias"/>

                <interceptor-ref name="servletConfig"/>

                <interceptor-ref name="prepare"/>

                <interceptor-ref name="i18n"/>

                <interceptor-ref name="chain"/>

                <interceptor-ref name="modelDriven"/>

                <interceptor-ref name="fileUpload"/>

                <interceptor-ref name="staticParams"/>

                <interceptor-ref name="params"/>

                <interceptor-ref name="conversionError"/>

                <interceptor-ref name="validation">

                    <param name="excludeMethods">cancel,execute,delete,edit,list</param>

                </interceptor-ref>

                <! -- <interceptor-ref name="json" /> -->

            </interceptor-stack>

        </interceptors>

 

        <!-- 定义在<action>元素里面的<result>我们可以称之为局部<result>,除此之外我们还可以定义全局的<result>,这些全局的<result>会被多个<action>所共享。

                                    框架会首先寻找嵌套在<action>元素中的<result>,如果没有匹配的就去全局<result>中寻找。全局的<result>列表定义在<global-results> --> 

        <global-results>

            <result name="dataAccessFailure">dataAccessFailure.jsp</result>

            <result name="error">error.jsp</result>

            <result name="loginLink" type="freemarker">/WEB-INF/pages/loginalert.ftl

            </result>

        </global-results>

 

        <!-- name        用来表示该异常配置信息

             result      指定发生异常时显示的视图信息,这里要配置为逻辑视图

             exception         指定异常类型 --> 

        <global-exception-mappings>

            <exception-mapping exception="org.springframework.dao.DataAccessException"

                               result="dataAccessFailure"/>

        </global-exception-mappings>

 

       <!-- Action 配置中的各个默认值   actionclass->ActionSupport     actionmethod->execute      resultname->SUCCESS=success

       Action中的result的各种转发类型 type ①dispatcher:默认的,内部请求转发 ②redirect:浏览器重定向  ③redirectAction:重定向到另一个action  ④plainText:原样输出网页源代码,不执行Jsp

                        本项目配置type=freemarker             freemarker为模版引擎    

                         配置中${属性名} 对应action中的属性    <param name="方法"> </param> action 进行方法的注入值

       Action  name=”helloworld_*” method=”{1}” 如果请求的url尾是helloworld_execute,调用的是execute方法如果是 helloworld_other,调用的是 other 方法

       http://www.cnblogs.com/yinger/archive/2011/07/25/2116707.html

       --> 

        <!--<action name="login" class="com.travelsky.linkoSky.web.action.LoginAction"

              method="loginPage"> -->

        <!--<result name="success" type="freemarker">/WEB-INF/pages/login.ftl</result> -->

        <!--</action> -->

        <action name="loginIn" class="com.travelsky.linkoSky.web.action.LoginAction"

                method="doLogin">

            <result name="login" type="freemarker">/error/login_error.ftl</result>

            <result name="success">/index.html</result>

        </action>

        ……………………………………….更多actions

    </package>   

</struts>

 

2)   web.xml 位置src/main/webapp/WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"

         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"

         version="2.4">

 

    <!-- 加载顺序  context-param -> listener -> filter -> servlet  参考  http://www.java3z.com/cwbwebhome/article/article8/81136.html  -->

   <!-- filter 过滤器元素将一个名字与一个实现 javax.servlet.Filter接口的类相关联。     -->

   <!-- filter是个request到达servlet之前预处理request,也可以在离开servlet时处理response. 是一个servlet chaining”(servlet ).一个filter 包括:

  1. servlet被调用之前截获;2. servlet被调用之前检查servlet request;3. 根据需要修改request头和request数据;4. 根据需要修改response头和response数据;

      5. servlet被调用之后截获. login-filter为本系统定义的一个filter  com.travelsky.filter.LoginFilter -->

   <!-- 多个过滤器  会用FilterChain来决定次序 -->    

   <!-- <filter-name>子元素定义了个过滤器的名字,<filter-class>指定了由容器载入的实际类,<init-param>子元素为过滤器提供初始化参数 -->

   <!--  参考 http://www.cnblogs.com/jinzhengquan/archive/2011/02/16/1955778.html -->

    <filter>

        <filter-name>login-filter</filter-name>

        <filter-class>com.travelsky.filter.LoginFilter</filter-class>

    </filter>

    <filter>

        <filter-name>struts-cleanup</filter-name>

        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter</filter-class>

        <init-param>

            <param-name>actionPackages</param-name>

            <param-value>org.csair.sshframework.app</param-value>

        </init-param>

    </filter>

    <filter>

        <filter-name>struts</filter-name>

        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter</filter-class>

    </filter>

 

   <!-- 一旦命名了一个过滤器,就要利用filter- mapping元素把它与一个或多个servletJSP页面相关联 -->

   <!-- <filter-mapping> 主要由<filter-name>,<servlet-name><url-pattem>子元素组成。<servlet-name>将过滤器映射到一个或多个Servlet上,

   <url-pattem>将过滤器映射到个或多个任意特征的URLJSP页面。 /* 表示所有的请求都会拦截 -->

    <filter-mapping>

        <filter-name>login-filter</filter-name>

        <url-pattern>/*</url-pattern>

    </filter-mapping>

 

    <filter-mapping>

        <filter-name>struts-cleanup</filter-name>

        <url-pattern>/*</url-pattern>

    </filter-mapping>

 

    <filter-mapping>

        <filter-name>struts</filter-name>

        <url-pattern>/*</url-pattern>

    </filter-mapping>

 

   <!-- context-param,它用于向 ServletContext 提供键值对,即应用程序上下文信息。我们的 listener, filter 等在初始化时会用到这些上下文中的信息 -->

    <context-param>

        <param-name>contextConfigLocation</param-name>

        <param-value>

            classpath*:applicationContext.xml

        </param-value>

    </context-param>

 

    <!--<listener>-->

        <!--<listener-class>com.travelsky.listener.StartUpListener</listener-class>-->

    <!--</listener>-->

    <!--使用ContextLoaderListener监听器。这个监听器中会有一个ContextLoade类用来获取这个context-param 配置文件中的信息contextConfigLocation spring监听器  -->

    <listener>

        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

    </listener>

 

    <welcome-file-list>

        <welcome-file>login.html</welcome-file>

    </welcome-file-list>

 

   <!-- 在返回特定HTTP状态代码时,或者特定类型的异常被抛出时,能够制定将要显示的页面。http://blog.csdn.net/ly5156/article/details/6950081     -->

    <error-page>

        <error-code>404</error-code>

        <location>/error/404.jsp</location>

    </error-page>

 

    <error-page>

        <error-code>500</error-code>

        <location>/error/error.jsp</location>

    </error-page>

   

    <error-page>   

       <exception-type>java.lang.NullException</exception-type>   

       <location>/error.jsp</location>   

   </error-page>    

</web-app>

3)   accounts.properties 或者 jdbc.properties 位置/src/main/resources

4)   spring配置文件 applicationContext.xml位置/src/main/resources

5)    

二、B2bDataserver

1)   spring配置文件 applicationContext.xml位置/src/main/resources

 

       2)   spring 注入注释使用

Ø   @Autowised 它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。AutowiredAnnotationBeanPostProcessor 将扫描 Spring 容器中所有 Bean,当发现 Bean 中拥有 @Autowired 注释时就找到和其匹配(默认按类型匹配)的 Bean,并注入到对应的地方中去.

@Autowired没有匹配的bean时,会爆出错来的抛出 BeanCreationException 异常。可以@Autowired(required=false)时,就不会抛出上述异常。

@Autowired匹配多个bean时,也会抛出BeanCreationException 异常。可以使用@qualifier 来指定使用哪个名字(即配置中的id值)的bean对象。如:

                 @Autowired

public void setOffice(@Qualifier("office")Office office) {this.office = office;}

Ø   @resource 作用与@Autowired @Resourse默认通过name注入,而@Autowired通过type注入。

@Resource 有两个属性是比较重要的,分别是 name 和 type,Spring 将 @Resource 注释的 name 属性解析为 Bean 的名字,而 type 属性则解析为 Bean 的类型。所以如果使用 name 属性,则使用 byName 的自动注入策略,而使用 type 属性时则使用 byType 自动注入策略.

@Resourse驱动需要注册bean  <bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/>

Ø   @Postconstruct  @Predestroy标签 @Postconstruct 在类初始化后进行调用,@Predestroy是类destroy之前调用。此两个参数是用在方法前标注的。在xml配置中是对应init-methoddestroy-method两个方法。

Ø   springxml配置文件中<beans>配置 <context:annotation-config/>。 将隐式地向 Spring 容器注册 AutowiredAnnotationBeanPostProcessorCommonAnnotationBeanPostProcessorPersistenceAnnotationBeanPostProcessor 以及 equiredAnnotationBeanPostProcessor 4 BeanPostProcessor

Ø   @Component是对应xml配置中的一个bean配置. @SCOPE属性为single 也可以指定@Scopeprototype,这样每次返回的每次实例都是新的

@Scope("prototype")

@Compnent(“boss”) //bean Boss名称定义为boss

Public class Boss{}

Ø   扫描过滤类:

过滤器类型

说明

注释

假如 com.baobaotao.SomeAnnotation 是一个注释类,我们可以将使用该注释的类过滤出来。

类名指定

通过全限定类名进行过滤,如您可以指定将 com.baobaotao.Boss 纳入扫描,而将 com.baobaotao.Car 排除在外。

正则表达式

通过正则表达式定义过滤的类,如下所示: com\.baobaotao\.Default.*

AspectJ 表达式

通过 AspectJ 表达式定义过滤的类,如下所示: com. baobaotao..*Service+

 

Ø   @Servive @Repository @Controller分别对应持久层,业务层,和控制层,作用和@Component等同。

Ø   参考:http://www.ibm.com/developerworks/cn/java/j-lo-spring25-ioc/

Ø    @SuppressWarnings("unchecked")  屏蔽某些编译时的警告信息,在强制类型转换的时候编译器会给出警告

 

 

3)   Spring取到bean

可以使用  BeanFactory factory = new XmlBeanFactory(resource); factory.getBean(bean名称);也可以使用appContext = new ClassPathXmlApplicationContext("springDataservice/applicationContext.xml"); appContextgetBean(bean名称);

4)   线程

Ø   线程、线程组、什么是幽灵线程(为其他线程提供服务资源数据的线程)

Ø   新线程态,可运行态,非运行态(sleep suspend wait 等待1/o,死亡态

Ø   Java中建立线程有两种方法,一种是继承Thread类,另一种是实现Runnable接口。提出采用Runnable接口。

5)    

 

6)  

 

三、设计模式headfirst

1)         工厂模式

²  可以利用静态方法定义为简单工厂的方法.也是常见技巧。

²  用工厂类初始化客户类(如比萨店)。

²  依赖倒置原则:具体类最好依赖抽象,不要依赖具体类!最好在驱动类中来实例化具体类!

不管是高层组件还是低层组件,依赖抽象是最好的设计原则!

怎么做到上述原则:类中变量不可以持有具体类(即使用new一个对象),使用工厂类实现。

不要让类派生来自具体类。可以不要覆盖基类中已经实现的方法。

²  抽象工厂模式:使客户类提供接口创建一系列的相关和依赖的对象家族,而不需要指定具体类.

2)         单件模式

²  定义:确保一个类只有一个实例,并提供一个全局访问点。

²  Java 使用 static synchronized 来对实例对象的方法进行修饰,不允许多个线程执行此方法,但同步一个方法使性能下降100倍,如果使用volatile 修饰唯一的实例对象时,volatile关键词可以确保:对象被初始化成单列对象时,只有第一次彻底检查对象是否为空执行synchronized 里面的代码(参见73页)。

²  volatile定义:如果一个字段被声明成volatilejava线程内存模型确保所有线程看到这个变量的值是一致的。

²  单件模式确保有一个静态变量和一个静态方法,一个私有构造方法。

3)         命令模式-封装调用

²  将命令单独做成一个类,将对象与命令解耦合,在测试驱动时再传递一个对象个命令对象来驱动命令的执行,命令类里面装载一个要执行它的对象。命令可以达到多个对象的复用,也易于扩展命令类。

²  空命令类:初始化使用命令的类的对象,里面的方法皆为空方法。

²  为了更好的管理命令类对象和使用的类,我们也许还需要一个管理类。

²  宏命令:一次执行一组命令。将一组命令封装到一个宏命令类里面一起执行。宏命令也需要传入一个执行命令的对象。

²  命令模式的应用:队列请求,包括:工作队列,线程池,日程安排

工作队列:请求命令类对象不停的往工作队列填充命令类对象,处理命令类的对象的线程在另外一端取出命令,分发给相应处理此命令的线程来执行(excute())。完成后,将命令在队列中删除,然后继续取命令对象,如此循环不停的工作,主线程取出来命令后,分发给相应处理此命令的线程来完成其命令的请求。

Web服务器模式即为此模式架构。

²  命令模式的定义:将请求封装成对象,这可以让你使用不同的请求,日志,队列来参数化其他对象。

4)         适配器模式

²  适配器模式类的书写:1。需要先继承要转换成的类型接口,2.将要被转化的类的对象传入本类中。3进行适配。目的是使两个不同的类(对象)通过适配器转化后,可以使用同样的api 实现共同的目标接口,达到同样的使用效果。

²  定义:将一个类转化成客户期望的类的接口,可以将两个类亲密无间的合作工作。客户只看到目标接口。

²  Java 系统 enumeration(不存在remove()方法)适配成iterator类类使用,iterator类中remove 方法声明为unsupportoperationException类型。EnumerariotnIterator适配器中  public void remove( throw new unsupportoperationException(); )

5)         外观模式

²  定义:将接口变得更简单。封装接口,以一种简单的表现形式展现。

²   

6)         模版方法模式封装算法

²  模版的基类一般是一个抽象类,其实是一个算法模版,定义了算法的步骤,可以起到规范算法的作用,但同时又把一些步骤放到子类中去实现的,把公用的方法放里面,不共用的方法声明空方法,继承类各自实现空的方法,来实现做到自己的业务。

²  钩子方法:是模版类中的空方法,由子类继承来实现的方法,也由子类决定是否实现,一般是实方法,钩子的作用也可以作为类中的条件控制语句

²  模版模式中方法:钩子方法,抽象方法,一般其他方法,若子类必须实现的方法,使用抽象方法,可以实现也可以不用实现的话,则可以钩子方法。

²  好莱坞原则:别调用我们(别打电话给我们),我们会调用你的(高层组件对待低层组件的原则)

²  Java例子:Java 数组使用了模版类钩子实现,sort()中方法merger()方法调用钩子compareTo()来的。compareTo()来自接口conparable接口,故需要排序的类需要继承comparable接口并且在类中compareTo()方法,此方法是实现两个对象的比较,返回两个对象的大于,等于或者小于。

²  Java例子 jframeswing容器,jframe是最基本的swing的容器,中有paint()方法,是一个钩子方法,什么事情都不做,覆盖paint()方法画出你需要的图形。

²  Java例子:applet程序,此程序也是使用钩子的,其钩子函数们为:init(),stop(),destroy(),paint(),start();

7)         迭代器和组合模式

²  书本例子(221):菜单类使用array 菜单类2使用arrayList 类型:统一起来使用iterator,写一个iterartor类来继承接口iterator,然后传入数组,将数组实现hasNext(),next()方法.(,同样也需要将arrayLIst也如前一个一样实现一个iterator.)array数组类添加此类的对象函数创建一个iterator对象,然后在客户端waitress类里面调用菜单类的createrIterator来创建一个itrator对象就可以统一的使用。实际上添加了两个迭代器,然后在原来的类里面添加两个转化成迭代器的方法,就可以统一的使用!

²  使用java的系统接口iterator来改良上述的设计(java.util.iterator),把创造迭代器放在menu接口,让原来的两个菜单来继承现在的菜单接口,在waitress类中就可以使用统一的menu接口声明原来的两个菜单类,好处是使waitress类针对接口编程,不再是针对实现编程

²  定义:提供一种统一的方法顺序方法聚合元素内的各个对象,但又不会暴露聚合类内的内部表示

²  这样代码更容易维护,也易于扩展。

²  设计原则:一个类应该只有一个引起变化的原因.如管理聚合类,和遍历聚合类就为两个变化的原因。其中一个变化整个类也变化,因此最好将其中一个变化的原因的责任分配给另一个新的类来处理!减少了耦合。

8)         组合模式---承迭代模式

²  定义:允许你将对象组合成树形结构来表现“整体/部分”层次结构,组合可以让客户以一致的方式来处理个别对象和对象组合。

²  承上7)上列菜单例子解说,现在菜单需求为:已经是一个树形菜单。设计变更为:设计一个menuComponent抽象类,拥有子菜单和菜单节点的方法和属性并且还有一个创造迭代器接口的方法,其方法初始化都为抛出异常 void ….throw  new UnsupportOprationException ;;其子菜单类和菜单节点类都继承上述的类,将相应的方法实现,遍历时可以使用之前的创建迭代器的接口,

下面是菜单的遍历的代码:

public void print() {

                            System.out.print("\n" + getName());

                            System.out.println(", " + getDescription());

                            System.out.println("---------------------");

 

                            Iterator iterator = menuComponents.iterator();

           //本段代码需要结合下面的CompositeIterator类来看

                            while (iterator.hasNext()) {

                                          MenuComponent menuComponent =

                                                        (MenuComponent)iterator.next();

                                          menuComponent.print();

                            }

              }

下面是实现了遍历的树的菜单的迭代器类。

package headfirst.composite.menuiterator;

import java.util.*;

public class CompositeIterator implements Iterator {

              Stack stack = new Stack();

              public CompositeIterator(Iterator iterator) {

                            stack.push(iterator);

              }

              public Object next() {

                            if (hasNext()) {

                                          Iterator iterator = (Iterator) stack.peek();

                                          MenuComponent component = (MenuComponent) iterator.next();

                                          if (component instanceof Menu) {

                                                        stack.push(component.createIterator());

                                          }

                                          return component;

                            } else {

                                          return null;

                            }

              }

              public boolean hasNext() {

                            if (stack.empty()) {

                                          return false;

                            } else {

                                          Iterator iterator = (Iterator) stack.peek();

                                          if (!iterator.hasNext()) {

                                                        stack.pop();

                                                        return hasNext();

                                          } else {

                                                        return true;

                                          }

                            }

              }

              public void remove() {

                            throw new UnsupportedOperationException();

              }

}

空迭代器:菜单内没有任何可以迭代的数据;package headfirst.composite.menuiterator;

import java.util.Iterator;

public class NullIterator implements Iterator {

              public Object next() {

                            return null;

              }

              public boolean hasNext() {

                            return false;

              }

              public void remove() {

                            throw new UnsupportedOperationException();

              }

}

9)         状态模式状态机

 

 

 

 

 

 

一些笔记

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号