小知识类积

java打开新页面

 

public static void main(String[] args) {
  try {
      Process p = Runtime.getRuntime().exec(
      "explorer.exe http:baidu.com");
      } 
     catch (Exception e1)
      {
      e1.printStackTrace();
      }
 }

 

 

springmvc和struts2的区别

 

比较了一下strus2与spring3 mvc的差别
============================================
struts2框架是类级别的拦截,每次来了请求就创建一个Action,然后调用setter getter方法把request中的数据注入
struts2实际上是通过setter getter方法与request打交道的
struts2中,一个Action对象对应一个request上下文

spring3 mvc不同,spring3mvc是方法级别的拦截,拦截到方法后根据参数上的注解,把request数据注入进去
在spring3mvc中,一个方法对应一个request上下文

好了 我们来整理一下
struts2是类级别的拦截, 一个类对应一个request上下文,
springmvc是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应
所以说从架构本身上 spring3 mvc就容易实现restful url
而struts2的架构实现起来要费劲
因为struts2 action的一个方法可以对应一个url
而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了

===================================

spring3mvc的方法之间基本上独立的,独享request response数据

请求数据通过参数获取,处理结果通过ModelMap交回给框架
方法之间不共享变量

而struts2搞的就比较乱,虽然方法之间也是独立的,但其所有Action变量是共享的
这不会影响程序运行,却给我们编码 读程序时带来麻烦

====================================
spring3 mvc的验证也是一个亮点,支持JSR303

处理ajax的请求更是方便 只需一个注解@ResponseBody ,然后直接返回响应文本即可

附上一段代码 :

@RequestMapping(value="/whitelists")

public String index(ModelMap map){

Account account = accountManager.getByDigitId(SecurityContextHolder.get().getDigitId()) ;

‍   List<Group> groupList = groupManager.findAllGroup(account.getId()) ;

   map.put("account", account);

   map.put("groupList", groupList);

   return "/group/group-index" ;

}

//@ResponseBody ajax响应 

@RequestMapping(value="/whitelist/{whiteListId}/del")

@ResponseBody 

public String delete(@PathVariable Integer whiteListId){

   whiteListManager.deleteWhiteList(whiteListId) ;

   return "success" ;

}

Struts 和 SpringMVC 的区别是什么呢?

很多人学习了ssh ,都晓得struts最早被人用来控制表现层,但是struts已经有了mvc 为什么还有spring mvc呢?

所以我稍微查阅了一些资料,总结了一下他们的区别:

1. 机制。spring mvc 的入口是serclet, 而struts是filter(这里要指出,filter和servlet是不同的。以前认为filter是servlet的一种特殊),这样就导致了二者的机制不同,

这里就牵涉到servlet和filter的区别了,我其他博客 会专门写一写 servlet和filter之间的区别。

2.性能。 spring会稍微比struts快。spring mvc 是基于方法的设计,而sturts是基于类,每次发一次请求都会实例一個 action  ,每个action都会被注入属性, 而spring基于方法,粒度更细,但要小心把握像在servlet控制数据一样。

3.参数传递。 struts是在接受参数的时候,可以用属性来接受参数, 这就说明参数是让多个方法共享的。

4.设计思想上。struts 更加符合oop的编程思想, spring就比较谨慎,在servlet上扩展,

5.intercepter的实现机制。struts有以自己的interceptor机制,spring mvc 用的是独立的AOP方式。这样导致struts的配置文件量还是比spring mvc大,虽然struts的配置能继承,所以我觉得论使用上来讲,spring mvc使用更加简洁。

 

三、struts2拦截器说明

本节代码说明Struts2中的拦截器缺省配置及其各拦截器的功能。

拦截器和拦截器栈的定义配置格式。
Struts2定义的各个拦截器功能介绍。

演示代码

<!-------------文件名: struts-default.xml---------> 
  1. <interceptors> 
  2.             <interceptor name="alias" 
  3.         class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/> 
  4.             …………… 
  5.             <interceptor name="roles"  
  6. class="org.apache.struts2.interceptor.RolesInterceptor" /> 
  7.  
  8.             <!—基础栈 --> 
  9.             <interceptor-stack name="basicStack"
  10.                 <interceptor-ref name="exception"/> 
  11.                 <interceptor-ref name="servletConfig"/> 
  12.                 <interceptor-ref name="prepare"/> 
  13.                 <interceptor-ref name="checkbox"/> 
  14.                 <interceptor-ref name="params"/> 
  15.                 <interceptor-ref name="conversionError"/> 
  16.             </interceptor-stack> 
  17.  
  18.             <!—校验和工作流栈 --> 
  19.             <interceptor-stack name="validationWorkflowStack"
  20.                 <interceptor-ref name="basicStack"/> 
  21.                 <interceptor-ref name="validation"/> 
  22.                 <interceptor-ref name="workflow"/> 
  23.             </interceptor-stack> 
  24.  
  25.             <!—文件上传栈--> 
  26.             <interceptor-stack name="fileUploadStack"
  27.                 <interceptor-ref name="fileUpload"/> 
  28.                 <interceptor-ref name="basicStack"/> 
  29.             </interceptor-stack> 
  30.  
  31.             <!—模型驱动栈  --> 
  32.             <interceptor-stack name="modelDrivenStack"
  33.                 <interceptor-ref name="modelDriven"/> 
  34.                 <interceptor-ref name="basicStack"/> 
  35.             </interceptor-stack> 
  36.  
  37.             <!—action链栈 --> 
  38.             <interceptor-stack name="chainStack"
  39.                 <interceptor-ref name="chain"/> 
  40.                 <interceptor-ref name="basicStack"/> 
  41.             </interceptor-stack> 
  42.  
  43.             <!-- i18n国际化栈 --> 
  44.             <interceptor-stack name="i18nStack"
  45.                 <interceptor-ref name="i18n"/> 
  46.                 <interceptor-ref name="basicStack"/> 
  47.             </interceptor-stack> 
  48.        </interceptors> 
<!-------------文件名: struts-default.xml--------->
<interceptors>
            <interceptor name="alias"
 		class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>
            ……………
            <interceptor name="roles" 
class="org.apache.struts2.interceptor.RolesInterceptor" />

            <!—基础栈 -->
            <interceptor-stack name="basicStack">
                <interceptor-ref name="exception"/>
                <interceptor-ref name="servletConfig"/>
                <interceptor-ref name="prepare"/>
                <interceptor-ref name="checkbox"/>
                <interceptor-ref name="params"/>
                <interceptor-ref name="conversionError"/>
            </interceptor-stack>

            <!—校验和工作流栈 -->
            <interceptor-stack name="validationWorkflowStack">
                <interceptor-ref name="basicStack"/>
                <interceptor-ref name="validation"/>
                <interceptor-ref name="workflow"/>
            </interceptor-stack>

            <!—文件上传栈-->
            <interceptor-stack name="fileUploadStack">
                <interceptor-ref name="fileUpload"/>
                <interceptor-ref name="basicStack"/>
            </interceptor-stack>

            <!—模型驱动栈  -->
            <interceptor-stack name="modelDrivenStack">
                <interceptor-ref name="modelDriven"/>
                <interceptor-ref name="basicStack"/>
            </interceptor-stack>

            <!—action链栈 -->
            <interceptor-stack name="chainStack">
                <interceptor-ref name="chain"/>
                <interceptor-ref name="basicStack"/>
            </interceptor-stack>

            <!-- i18n国际化栈 -->
            <interceptor-stack name="i18nStack">
                <interceptor-ref name="i18n"/>
                <interceptor-ref name="basicStack"/>
            </interceptor-stack>
       </interceptors>

代码解释
(1)在xml配置文件中配置拦截器和拦截器栈都是以“<interceptors>”开头,以“</interceptors>”结尾。
(2)配置拦截器的格式如上面代码所示以“<interceptor/>”格式显示,其中两个属性name是拦截器名字,另一个是对应的类路径,因为之前也已经说过其实拦截器也是一个普通的Java对象。
(3)拦截器栈的格式是以“<interceptor-stack >”开头,以“</interceptor-stack>”结尾。其中属性name是拦截器栈名字。在 “<interceptor-stack >”和“</interceptor-stack>”之间可以设置拦截器。如代码所示格式为“<interceptor-ref />”,其中name属性也是拦截器名字。如果系统运行拦截器栈都是按照拦截器栈中定义的拦截器先后顺序执行拦截器。请读者仔细查看那个基础栈配置,其中配置的拦截器都是在xml文件中定义的拦截器。
注意:拦截器栈中不单单可以配置拦截器,它甚至还可以配置拦截器栈。比如在“validationWorkflowStack” 拦截器栈中就配置了“basicStack”拦截器栈。这样的话,配置的子拦截器栈中的拦截器也会被执行。这就类似于父集合和子集合的概念。
(4)针对struts-default.xml文件中各个拦截器配置,笔者一一做介绍,因为如果使用Struts2在Web项目开发中,这些拦截器都是默认缺省的会被执行的。因此了解一下Struts2底层的拦截器到底实现什么功能对开发人员来说是很有帮助的。
alias:对于HTTP请求包含的参数设置别名。
autowiring:将某些JavaBean实例自动绑定到其他Bean对应的属性中。有点类似Spring的自动绑定,在Spring部分会详细说明。
Chain:在Web项目开发中,以前使用Struts开发时候经常碰到两个Action互相传递参数或属性的情况。该拦截器就是让前一Action的参数可以在现有Action中使用。
conversionError:从ActionContext中将转化类型时候发生的错误添加到Action的值域错误中,在校验时候经常被使用到来显示类型转化错误的信息。
cookie:从Struts2.0.7版本开始,可以把cookie注入Action中可设置的名字或值中。
createSession:自动创建一个HTTP的Session,尤其是对需要HTTP的Session的拦截器特别有用。比如下面介绍的TokenInterceptor。
debugging:用来对在视图间传递的数据进行调试。
ExecAndWait:不显式执行Action,在视图上显示给用户的是一个正在等待的页面,但是Action其实是在“背后”正在执行着。该拦截器尤其在对进度条进行开发的时候特别有用。
exception:将异常和Action返回的result相映射。
fileUpload:支持文件上传功能的拦截器。
i18n:支持国际化的拦截器。
logger:拥有日志功能的拦截器。
modelDriven:Action执行该拦截器时候,可以将getModel方法得到的result值放入值栈中。
scopedModelDriven:执行该拦截器时候,它可以从一个scope范围检索和存储model值,通过调用setModel方法去设置model值。
params:将HTTP请求中包含的参数值设置到Action中。
prepare:假如Action继承了Preparable接口,则会调用prepare方法。
staticParams:对于在struts.xml文件中Action中设置的参数设置到对应的Action中。
scope:在session或者application范围中设置Action的状态。
servletConfig:该拦截器提供访问包含HttpServletResquest和HttpServletResponse对象的Map的方法。
timer:输出Action的执行时间。
token:避免重复提交的校验拦截器。
tokenSession:和token拦截器类似,但它还能存储提交的数据到session里。
validation:运行在action-validation.xml(校验章节将介绍)文件中定义的校验规则。
workflow:在Action中调用validate校验方法。如果Action有错误则返回到input视图。
store:执行校验功能时候,该拦截器提供存储和检索Action的所有错误和正确信息的功能。
checkbox:视图中如果有checkbox存在的情况,该拦截器自动将unchecked的checkbox当作一个参数(通常值为 “false”)记录下来。这样可以用一个隐藏的表单值来记录所有未提交的checkbox,而且缺省unchecked的checkbox值是布尔类型的,如果视图中checkbox的值设置的不是布尔类型,它就会被覆盖成布尔类型的值。
profiling:通过参数来激活或不激活分析检测功能,前提是Web项目是在开发模式下。(涉及到调试和性能检验时使用)
roles:进行权限配置的拦截器,如果登录用户拥有相应权限才去执行某一特定Action。

 

四   单例模式:

单例模式的三大特征是:1.要求此类在整个虚拟机只能有一个实例

2.别人不能NEW对象,只能自己new

3.提供对外方法,返回自己唯一实例

第一种饿汉模式

public class Singleton(){

//私有化构造器

private Singleton(){}

//自行实例化对象

public static finally  Singleton s = new singleton();

//提供对外使用方法

public static Singleton getInstance(){

return s;

 

}

}

 

第二种懒汉模式

public class Singleton(){

//私有化构造器

private Singleton(){}

private static Singleton s;

//静态语句块,当类加载时加载,

static{

s=new Singleton();

 

}

//提供对外使用方法

public synchronized static Singleton(){

  if(s!=null){

return s;

}

return s = new Singleton();

}

 

}

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值