java web 笔记

原创
2016/11/27 11:08
阅读数 16

请问HttpServletRequest和ServletRequest的区别? 

servlet理论上可以处理多种形式的请求响应形式 
http只是其中之一 

所以HttpServletRequest、 HttpServletResponse分别是ServletRequest和ServletResponse的子类 
=====================
resin热部署
不用重启resin直接上传class后立即生效需要在resin.conf中有如下配置:
<!--
     - For production sites, change dependency-check-interval to something
     - like 600s, so it only checks for updates every 10 minutes.
    -->
  <dependency-check-interval>1s</dependency-check-interval>
====================
struts2中action中获取web请求的一些信息,内置对象中其他的多数都可以用actioncontext.getSession等这样的,request的时候必须使用actionContext.get("request"),其实获取的方式是一样的。完全一样。actionContext.getParameters()这个返回的map的值是一个数组,但是不能写成object[]。还必须写object。这个parameters只能读不能写,写不会出错但是写不进去。
ActionContext ac = ActionContext.getActionContext();使用这个静态方法获取

获取web请求资源的方式有多种,解耦和耦合两种,解耦方式有通过静态的ActionContext.getActionContext()方法,或者通过实现接口xxxaware接口方式,两种方式的区别是,前者需要每次都要去调用方法来获取上下文,后者通过实现接口后变成类的成员变量的方式可以在该类中一直使用。
=======================
actionSupport,是默认的action类,若某个action节点没有配置actionclass属性,则actionsupport则为默认执行的action类。
<action name="xx">
    <result>xx.jsp</result>
</action>
等同于
<action name="xx" class="xxxx.xwork.ActionSupport">
    <result type="success">xx.jsp</result>
</action>
======================
action配置中result:
一共有2个属性,type:
 >dispatcher(默认的):转发同servlet那个意思,浏览器地址不变。一次请求
 >redirect:重定向:浏览器地址改变,2次请求
 >redirectAction:重定向到一个aciton
 >chain:转发到一个action
========================
El表达式和struts标签的区别
标签可以调用任何一个类中的静态方法
========================
实现ModelDriven接口,可以使用对象模型驱动。使用getModel方法来判断是否是create还是update,ModelId比较频繁使用,所以可以直接放在action中作为参数。
struts默认的拦截器,是modelDriver拦截器在params之前,所以要想在getModel中获取参数就必须跟换默认拦截器(使用action实现prepareable接口的方式为每个方法执行前做准备工作,例如更新的准备方法为prepareUpdate),使用
<default-interceptor-ref name="paramsPrepareParamsStack"></default-interceptor-ref>,
优化方案:
<interceptors>
            <interceptor-stack name="leogen">
                <interceptor-ref name="paramsPrepareParamsStack">
                    <param name="prepare.alwaysInvokePrepare">false</param>
                </interceptor-ref>
            </interceptor-stack>
        </interceptors>
        <default-interceptor-ref name="leogen"></default-interceptor-ref>
不适用全局的prepare()方法,只使用针对某个特殊的方法进行执行前的准备工作。
=====================
struts2标签中要 强制字符串位表达式 %{getText('username')}
================
strut2本地化,实现中英语言切换,request_locale,如果请求参数中带有这个参数则会把参数值放进session中,如果包含request_only_locale则只是在本次请求中包含本地locale而已。struts是通过一个i18nintercept来处理国际化的。优先级request_locale->request_only_locale_locale。最后是本底浏览器默认的语言。这个方式必须先经过action跳转的jsp页面才有用,因为只有经过action才会经过拦截器,所以经过requet_locale后直接访问jsp,之前存储的request_locale不起作用。
==========================
短路验证,若对一个字段使用多个验证器,默认情况下会执行所有验证,若希望前面的验证没有通过,后面的验证就不验证的话可以使用短路验证。配置:short-circuit="true"。
若类型转换失败,默认情况下还会执行后面的拦截器,所以还会进行验证,因为类型转换拦截器在验证拦截器前面。可以重写源码,ConversionErrorInteceptor类。
Object action = invocation.getAction();
if(action instanof ValidationAware){
ValidationAware va = (ValidationAware)action;
if(va.hasFieldErrors()||va.hasActionErrors){//只要有字段上的错误或者action级别的任何错误就返回input。
return "input";
}
}
=========================
验证方式有 ,字段级别上的验证和非字段级别上的验证。
字段级别的验证打印出错消息在fieldErrors,非字段验证则在acitonError里
<validators>
  <field name="age">
    <field-validator type="int">
        <param name="min">20</param>
        <param name="max">30</param>
      <message>this param is not true</message>
    </field-validator>
  </field>
  <validator type="expression">
      <param name="expression"><![CDATA[password==password2]]></param>
      <message>password is not same</message>
  </validator>
</validators>
=====================
国际化文件中的写法
username=UserName
password=PassWord
age=Age
time=Time\:{0}
time2=Time:${date}//date位action中的一个成员变量,需要在action返回前赋值上这里才会显示。
submit=submit
count=count
error.int=%{getText(fieldName)}is between ${min} to ${max}//fieldName位值栈中的值
email=email
error.email=email is false
===========
struts2自定义验证器。
struts2有两种验证方式,一种是声明式验证,一种是编程式验证
=================
struts文件上传,可以通过配置文件限制上传文件的总大小,也可以限制单个文件的大小。
================
struts2表单重复提交使用<s:token>,当页面加载该标签时候会在页面生成一个隐藏域,同事也在session中放入同名的值,提交的时候核对两个值是否相等,相等则表示不是重复提交,执行接下去的方法,并删除token在session中的值。所以如果回退则其实session中已经没有值,但是页面还有隐藏域的值,此时提交,对比后值不同说明是重复提交表单,返回错误信息到页面。struts2的xml文件中需要配置一个专门的重复提交的result类型。该错误信息属于action级别的,所以存在于actionError中,并可以国际化该错误消息,国际化错误消息参考,struts-message.properties中。
===================
spring:
spring ioc提供两种类型的ioc容器的实现,一种是applicationContext,一种是beanFactory,第一种是面向spring的开发者的,第二种是面向spring框架本身的。
一般情况开发者都是使用applicationContext的。
或者bean的方式有两种,通过bean id的方式,还要衶通过类型的方式,getBean(“string”),getBean(H.class),第二种是在ioc容器里只有个这个class的配置。
如果xml配置中值含有特殊字符,例如含有<这种,使用cdata的方式包括起来 <![CDATA[<shanghai>]]
注入ioc容器的xml配置方式也有两种,一种是通过构造器的方式,一种是getset方法
xml配置中赋值null的专有标记:<constructor-arg><null/></constructor-arg>
================
内部bean不能被外部引用
==================
配置单例的集合bean,以供多个bean进行引用,需要导入util命名空间。
<util:list id="xx">
    <ref bean="xx1"/>
    <ref bean="xx2"/>
</util:list>
spring 2.5后引入p命名空间 例如<bean id=xx class="com..." p:name="" p:xx-ref=""/>

================
spring 配置继承,使用parent属性。
父类的bean 可以作为一个类来配置,也可以做为一个模板来配置,配置模板使用abstract="true",跟class中的意思一样,不能被实例化。
这样减少spring配置初始化时候加载。
如果一个bean 没有class属性,那么该bean必须是abstract类型,否则报错。子bean不是所有属性都会继承父bean,autowire和abstract这个属性就不会继承。
spring depend-on 配置依赖关系,依赖关系是指,实例化当前对象的时候要先准备另一个bean的资源。
spring ioc中创建的bean默认情况下是单例的,改变方法是配置bean的作用于实行 scope,如果scope=prototype,则spring ioc容器初始化的时候不会创建该实例
只有每次在通过getBean获取的时候才会去创建bean,并且不是单例的,每次都拿一个原型,构造函数都会每次getBean的时候执行。
===================
springEl 表达式
=================
spring bean的生命周期,在配置bean的时候可以配置 init方法和destory方法。流程:开始构造器方法,设置属性值,然后执行init方法,返回bean的实例对象,然后在执行
destory方法。
后置处理器bean,编写一个类实现BeanPostProcessor接口,有两个方法重写,然后在配置文件中配置该类为后置bean,则该类会在所有bean 在执行方法init的前后执行重写的方法类容。
所以加入后置bean的处理器后,生命周期变为:构造bean --设置属性值--执行后置处理器方法--init方法--执行后置处理器方法--返回实例化的bean--执行destory方法
===============
静态工厂方法和实例工厂方法 待学。。。
spring factoryBean待学。
===============、
jdbctemplat.queryForObject(sql,rowMapper,1),RowMapping制定如何去映射结果集的航,常用的的实现类为BeanPropertyRowMapper,使用sql中列的别名完成列名和类的属性名的映射,例如last_name lastName。
具名参数的使用。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
在线直播报名
返回顶部
顶部