Struts2框架的学习:
servlet到底是什么?
是sun公司提供的动态web资源的技术
sun公司在其API中提供了一个servlet接口,若用户想要开发一个动态的web资源,即开发一个java程序向浏览器输入相应的数据,需要完成相应的步骤:
1.编写java类,实现servlet接口
2.把开发好的java类部署到web服务器中
servlet的运行过程:
servlet程序是有WEB服务器调用,web服务器收到了客户端的Servlet访问请求
①Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步。
②装载并创建该Servlet的一个实例对象。
③调用Servlet实例对象的init()方法。
④创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
⑤WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。
struts2框架
* 什么是框架,框架有什么用?
* 框架 是 实现部分功能的代码 (半成品),使用框架简化企业级软件开发 ,提高开发效率。
* 学习框架 ,清楚的知道框架能做什么? 还有哪些工作需要自己编码实现 ?
* 什么是struts2框架,它有什么用?
* Struts 2是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。
* 其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心
* struts2=struts1+webwork;
* struts2框架是apache产品。
* struts2是一个标准的mvc框架。
* javaweb中的model2模式就是一个mvc模式。 model2=servlet+jsp+javaBean
* struts2框架只能在javaweb开发中使用的。
* 使用struts2框架,可以简化我们的web开发,并且降低程序的耦合度。
Struts1 和Struts2的比较:
Struts1中的Action需要依赖Servlet API
Struts2中的Action可以不用依赖Servlet API
可测试性: 1的Action测试性不好,因为需要容器支持,因为在Action依赖于Servlet API 2的Action测试性较好,可以直接写一个单元测试完成,因为Struts2的Action是一个Javabean对象
ActionForm方面:
1通常收集数据使用ActionForm,而ActionForm随着还需要继承,但是其复用效率降低,随着项目增大建立大量ActionForm给维护带来大量的工作量,但也有好处就是数据的搜集和控制进行了很好的分离
2可以不用ActionForm来收集数据,直接让Action收集数据,但也可以使用ActionForm的方式来收集数据,2采用了ModelDriven的方式来支持类似Struts1的ActionForm,所以2更加灵活
JSTL OGNL
转换器:数据类型转换 ,将数据转换成想要的类型
Action的执行控制:1是固定不变的 2通过拦截器,可以改变执行流程,灵活配置
1的Action是单例的,存在线程安全问题 1的Action必须继承
2的Action是多例的,不存在线程安全问题,2的Action可以不用继承
Struts2登录
需要注意:Struts2需要运行在JRE1.5及以上版本
1.新创建Java Web项目
2.引入Struts2的依赖包,放在WebRoot下的lib下(解压缩apps下面的blank全部复制到lib下面)
3.在blank里面查看web.xml文件,将下面内容拷贝到lib下面的web..xml文件中
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4.在bank中找到strut2配置文件,拷贝到src目录下面
5.注意首先更改编码格式china-stander,在webroot下创建相应的界面
5.创建Struts2的Action,在src下面创建相应的包和类,其中类不需要继承任何方法,但必须包含public String execute() throws Exception{} ,是存粹的java类pojo
6.在Action中提供getter和setter方法,便于搜集数据,这样的方法称为属性驱动模式
7.将JSP和Action配置到struts.xml中进行配置
<!-- 必须继承相应方法才能实现进一步判断 -->
<package name="struts" extends="struts-default">
<action name="login" class="com.struts.LoginAction">
<result name="success">/login_success.jsp</result>
<result name="error">/login_error.jsp</result>
</action>
8.了解default.properties和struts.xml等相关文件(位于相应的包下面)struts2的默认后缀为 .action
1.标签的那么属性,如果不配置,那么缺省值为success
2.Strust2提供了一个Action接口,在Action接口中定义了一些常量和execute()方法,我们使用该接口,这样开发更规范
3.struts2的常用配置参数:
一般里面进行相应的配置
<struts>
<!-- 将下面的属性设置为true,在struts.xml发生改变会立即加载,不建议在生产环境下使用 -->
<constant name="struts.configuration.xml.reload" value="true"></constant>
<!-- 会给出更加合理和规范的报错框架,生成一定的报告单,易于查错!! -->
<constant name="struts.devMode" value="true"></constant>
以上参数也有两种配置方式,一种是新建一个struts.properties文件中进行配置,或者是直接在struts.xml文件中进行设置,我们一般推荐使用在xml文件进行配置
Struts2在团队开发中的支持:(多配置文件)
1.可以为某个模块建立单独的配置文件,该配置文件的格式需要和struts.xml配置文件的格式一致
2.在struts.xml配置文件中采用标签引入
Struts2对ModelDriven模式的支持:
Struts2可以采用类似与Struts2中的Action1中的Action方式搜集数据,这种方式叫ModelDriven模式
如何实现模型驱动模式?
*创建User
*Action需要实现ModelDriven接口
*实现getModel()方法,返回Bean对象
Struts2的重定向学习:如何访问Servlet API(使用Actioncontext()方法)
Struts2通过Action访问Servlet API三种方式
1.通过ActionContext访问Servlet API 该方法不具有侵入性,是安全的
Struts2的重定向学习:
如何访问ServletAPI(使用Actioncontext()方法)
在登录界面新建must_login.jsp,然后为其建立一个新的Action进行相应的判断
if(username.equals("admin")&&password.equals("admin"))
{
//将登陆信息设置到session中
ActionContext.getContext().getSession().put("user", username);
//采用如下方式访问request
//ActionContext.getContext().put(key, value);
//采用如下方式访问application对象
//ActionContext.getContext().getApplication().put(key, value)
//采用getparameters方法区获取相应的值
//ActionContext.getContext().getParameters().put(key, value)
return "success";
在配置文件struts.xml进行相应的配置然后跳转测试
2.在struts2默认转发,也就是标签默认为
struts2重定向有两种方式:
type=”redirect”,可以重定向到任何一个web资源,如jsp或Action
如果要重定向到Action需要写上后缀:xxx.action
type=”radictAction”,可以重定向到Action,不需要写后缀,此种方式更为通用,不会因为后缀的改变影响配置
Struts2的运行机制————
1、客户端初始化一个指向Servlet容器的请求( 如tomcat)
2、请求经过一系列的过滤器(Filter)其中有一个重要的可选过滤器ActionContextCleanUp
3、接着调用StrutsPrepareAndExecuteFilter被调用,然后调用相应的AcitonMapper来决定调用某个action来执行
4、如果AcitonMapper决定调用某个action,ActionStrutsAndPrepareAndExecuteFilter把请求的处理交给ActionProxy
5、ActionProxy通过Configuration Manage询问框架的配置文件,找到需要调用的Action类
6、ActionProxy创建一个ActionInvocation(ActionInvocation在Action的执行过程中,负责Interceptor、Action和Result等一系列元素的调度)
7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相应的拦截器的调用
8、一旦Action执行完毕ActionInvocation负责根据根据struts.xml的配置文件找到相应result返回结果
3.关于struts2的type类型,也就是Result类型,他们都实现了共同的接口Result,都实现了execute()方法,它们体现了
策略模式,具体Result类型参见:struts2-default.xml文件
<package name="struts-default" abstract="true">
<result-types>
<result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
<result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>
<result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
<result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>
<result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>
<result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
<result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
<result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/>
<result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>
<result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" />
</result-types>
的类型,其中包括全局result和局部result两种基本方式!
Struts2的Action访问Srtvlet API的第二种方法:通过相应的接口实现
第二种方法:(具有侵入性)
可以通过实现实现装配接口,完成对Servlet API的访问
*ServletRequestAware取得HttpServletRequest对象
*ServletResponseAware取得HttpServletResponse对象
*ServletContextAware可以取得ServletContext对象(工具类)
第三种方案:(具有侵入性)
Struts2的Action访问Servlet API
可以通过ServletActionContext()提供的静态方法取得Servlet API
getPageContext()
setRequest()
getRequest()
setResponse()
getResponse()
Struts2的命名空间和字符集设置
采用命名空间,可以区分不同的包下相同的Action名称
如果packet的namespace属性没有指定属性,使用的默认命名空间为””
Struts2中的Action完整路径应该为:namespace+Action的名称
首先在指定的命名空间下查找Action,如果找到了就使用此Action,如果没有找到在上层目录中查找,
一直到根(缺省命名空间),在此过程中如果找到了Action就会使用此Action,如果都没有找到就会抛出Action没有找到异常
字符集设置:
关于Struts2的字符集问题,主要有三种配置方式:
*struts2.properities配置文件中
*struts2。i18n.encoding
*struts2.xml配置文件
<constant name="struts2。i18n.encoding" value="GB18031">
*strutsPrepareAndExecuteFilter.xml文件中进行配置
*struts2.xml配置文件
<constant name="struts2。i18n.encoding" value="GB18031">
*strutsPrepareAndExecuteFilter.xml文件中进行配置
struts2在框架中的位置
1.struts2是非侵入式设计,Action是pojo类的,不依赖Servlet API和Struts API
2.提供了拦截器,可以拦截可以进行AOP(面向切面编程)权限拦截
3.自动提供了类型转换器,可以将特殊的请求参数转换成需要的类型
4.struts2的输入验证可以指定方法进行验证
5.提供了全局的范围、保范围和Action范围的国际化资源文件管理实现
三层架构是指视图层(View) 服务层(Service) 持久层(Dao)
View层:用于接收用户提交请求的代码在这里编写
Service层:系统的义务逻辑主要在这里完成
Dao层:直接操作数据库的代理在这里编写
MVC就是Model模型 View模型 Controller控制器
View:视图,为用户提供使用界面,与用户进行直接交互
Model:模型,处理用户提交请求,并计算出响应结果的模块
Controller:控制器,用于将用户请求转发给相应的Model继续拧处理,并根据Model的计算结果向用户提供相应的响应
MVC和三层架构的相似和不同
绝对路径:一般是带盘符的,不随着位置的变化
相对路径:是相对与当前而言的,可以分为
前台相对路径(前台浏览器执行的代码所包含的 路径 html css js中的静态部分的路径)其中前台相对路径的参照路径是WEB服务器的根路径
后台相对路径是指:由服务器解析执行的代码及文件中所包含的路径(Java中的路径 js中的相动态路径 xml中的文件中的路径)
不以斜杠开头的相对路径:无论是前台路径和后台路径,其参照路径是当前资源的访问路径,而不是保存当前资源的保存路径
在javabean中定义的叫做成员变量而不是属性或者方法
什么是属性?
getter or setter方法名去掉前面的get或set后,剩余部分首字母小写后的部分称为属性
OGNL与值栈
对象图导航语言(Object-Graph Nava language)功能强大
OGNL里面的东西都在context map中,其中根部分对象可以直接引用 Maps representing the application, session, and request ,而引用其他对象需要夹#
值栈:难点
值栈和actioncontext的对象
值栈与值栈的context属性的关系
值栈的context属性与ActionContext的关系
其中最主要的两个对象是root(本质是ArrayList修改成栈) 和context(实质是map 通过初始化调用OGNL的静态方法创建一个默认方法)ActionContext实质就是同一个东西可以证明!!
值栈的获取:(麻烦)
当一个action请求来到不仅会创建一个Action实例,还会创建一个ValueStack对象用于存放Action运行过程中的相关数据
当请求结束,Action实例消失
ActionContext的Map中存放的是地址其中ValueStack的context中存放的是ActionContext的地址(引用)
动态调用方法:主要有两种 使用constant常量开始动态方法
使用通配符定义action 在定义name时候指定相应的名称,然后在method指定相应的占位符从而确定当前是哪一个位置,然后在输入名称指定相应的访问动态方法!
Action的三种请求参数方式:
属性驱动 将参数名称定义为参数名称action的name=”属性名”(针对表单数据较少,不适合属性过多)
域驱动 在action包里的定义相应的类
private Student student;然后在别处加上student.属性进行调用
集合数据接收(属于域驱动的一种)
模型驱动 :(推荐使用)action包里的java要实现ModelDriven