struts
1、struts:struts的体系与struts1.X体系差别非常大,因为struts2使用了webwork的设计核心(xwork)。
在struts2中使用拦截器来处理用户请求,从而允许用户逻辑控制器与servletAPI分离
即一个基于web的MVC框架。
2、struts2的优点:
1)struts2的应用不依赖于servletAPI和strutsAPI,这种设计属于无入侵式设计
2)struts2提供了拦截器,利用拦截器可以进行aop编程,如权限拦截
3)struts2提供了类型转换器,我们可以把特殊的请求参数转换成需要的类型
4)提供了全局范围,包范围和action范围的国际化资源等。
3、开发struts2依赖的jar包:
struts2-core-2.x.x.jar:struts2框架的核心类库。
xwork-core-2.x.x.jar:xwork类库,struts2在其上构建
log4j-api-2.x.jar,log4j-core.x.jar:struts2框架使用这个日志包进行日志记录。
servlet加载的时候,web.xml会全部加载。
4、使用域对象接受用户输入的数据:
1)创建使用Struts2的web项目
2)编写登录页面(login.jsp)
3)编写User实体类(javabean):用于接收用户输入的信息。
4)编写LoginAction类
action类名的编写是有一定规范的,即相对应的bean类加上action结尾。
action类里面有很多返回值为String类型的方法
5)编写success.jsp和error.jsp页面
6)配置Struts.xml文件
在Struts.xml配置action和result。通知Struts框架我们写的这个类是一个action,
将来Struts框架中要给这个类创建对象,调用方法以及这个action加入更多丰富的功能。
每创建一个action类或者添加了返回值为String的方法之后,都要在struts.xml文件里面进行相应的配置。
7)发布并测试
5、struts.xml:
<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="Login" class="com.swpu.day8.struts.LoginAction">
<result >/success.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
</struts>
package name:表示给当前package起一个名字为default,并且唯一标识这个package。
package namespace:表示当前package的命名空间为/,将这个package里面的所有action在被访问的时候,前面都要加上这个命名空间。
package extends:继承的包名为那个,一般默认为继承struts2里面的核心默认包struts-default
action name:表示为将来在浏览器要访问这个action类就要以Login开头的名字去匹配。
action class:该action类在项目中的位置,即含包名的全类名。
action result:返回的结果是什么,即想跳转的某个页面。
6、struts2框架默认过滤以".action"结尾的URL,所以我们使用struts框架访问页面上时都要以.action结尾。
7、ModelDriven:
在struts2中,提供了另外一种直接使用领域对象的方式,就是让action实现con.opensymphony.xwork2.ModelDriven接口,
ModelDriven可以直接操作应用程序中的领域对象。
struts实现了ModelDriven接口,表单字段就不需要再使用user前缀了。
使用action的属性接收用户输入
在某些应用场景或一些简单的应用中,可能不需要使用模型对象,如果单纯为了接收用户的数据数据而创建模型,
struts接收请求里面的参数的方式:
1)通过领域对象来接收参数,在action类中为领域对象创建get,set方法,并且在表单中的name属性里的格式为“对象名.属性名”
2)通过ModelDriven<实体类名>方式接收参数,在action类中实例化实体类,重写getModel方法,返回当前实体类的对象
并且在表单中name属性里的格式为“属性名”,不需要加上对象名的前缀。
3)使用action的属性接收用户输入的参数,在action中私有属性名称,并且为该属性提供get,set方法。
并且在表单中name属性里的格式为“属性名”。
访问request、session、application对象
struts访问servletAPI的方式
1)通过解耦合的方式获取:ActionContext.getContext()产生的对象获取request、session、application
2)通过耦合的方式获取:ServletActionContext.getRequest()获取request对象
ServletActionContext.getServletContext()获取application对象
明天有个面试:记点题。
1:short s1=1,s1=s1+1;这个是不对的,因为1为int型,s1为short,1和s1相加为int型,如果直接复制给short型的会损失精度
short s1=1,s1+=1;这个是对的,因为s1+=1是s1=s1+1的简写,但是这个简写其实有一个隐式的类型转换,s1=(short)s1+1,所以这个赋值是可以成立的。
2:int 和integer的区别:integer的int的包装类。
public class Test03 {
public static void main(String[] args) {
Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;
//因为是Integer类型,所以四个均是对象的引用,所以比较的不是值。而是引用
System.out.println(f1 == f2);true
System.out.println(f3 == f4);false
}
}
简单的说,如果整形字面量的值在-128到127之间,那么不会new新的Integer对象,
而是直接饮用常量池中的Integer对象。
3:面向对象的特征:
抽象:将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象
抽象只关心对象有哪些属性和行为而不关注这些行为的细节。
继承:从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类,超类,基类。
得到继承信息的类被称为子类,派生类。继承让变化中的软件系统有了一定的延续性。
继承也是封装程序中可变因素的重要手段。
封装:把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。
面向对象的本质就是将现实世界描绘成一系列完全自治,封闭的对像。
封装就是隐藏一切可以隐藏的东西,只对外界提供最简单的编程接口。
多态性:允许不同的子类型的对象对同一消息作出不同的响应,即同样的对象引用调用同样的
的方法但是做了不同的事情。
分为运行时多态性和编译时多态性。
重载实现的是编译时的多态性,重写实现的是运行时的多态性。
4:栈:定义的基本数据类型的变量,对象的引用,函数调用的现场保存
堆:通过new关键字和构造器创建的对象的保存,是垃圾收集器管理的主要区域。
由于现在的垃圾收集器都采用分代收集算法,所以堆空间还可以细分为新生代和老生代。
方法区:和堆都是各个线程共享的内存区域,用于存储已经被JVM加载的类信息,
常量,静态变量,jit编译器编译后的代码等数据。
5:在Java5以前,switch能是byte,short,char,int,5以后Java引入了枚举类型,7以后还可以是字符串类型
但是long类型在所有版本中都是不可以的。
6:对象值相同,hashcode一定相同,但是hashcode相同,对象值不一定相同。
7:被final修饰的类不能被继承。比如String
8:String是只读字符串,即内容不能被改变。而StringBuilder表示字符串对象可以直接进行修改。
StringBuilder是在单线程环境下使用的,它的所有方面都没有被synchronize修饰,因此它的效率较StringBuffer高。
9:重载:发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则被视为重载
实现的是编译时的多态性,对返回类型没有特殊的要求。
重写:实现的是运行时的多态性。
发生在子类和父类之间,要求子类被重写的方法与父类的方法有相同的返回类型,比父类被重写的方法更好被访问,不能比父类被重写的方法声明更多的异常。
10:char型变量可以存储一个中文汉字,因为Java中使用的编码方式是Unicode(不选择任何特定的编码,直接用字符在字符集中的编号,是统一的唯一的方法),一个char类型占两个字节,16比特。