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

Struts2的学习 主要是知识点和基础知识相关推荐

  1. Android音视频学习系列(五) — 掌握音频基础知识并使用AudioTrack、OpenSL ES渲染PCM数据

    系列文章 Android音视频学习系列(一) - JNI从入门到精通 Android音视频学习系列(二) - 交叉编译动态库.静态库的入门 Android音视频学习系列(三) - Shell脚本入门 ...

  2. MATLAB学习笔记2:MATLAB基础知识(下)

    阅读前请注意: 1. 该学习笔记是华中师范大学HelloWorld程序设计协会2021年寒假MATLAB培训的学习记录,是基于培训课堂内容的总结归纳.拓展阅读.博客内容由 @K2SO4钾 撰写.编辑, ...

  3. DL:深度学习(神经网络)的简介、基础知识(神经元/感知机、训练策略、预测原理)、算法分类、经典案例应用之详细攻略

    DL:深度学习(神经网络)的简介.基础知识(神经元/感知机.训练策略.预测原理).算法分类.经典案例应用之详细攻略 目录 深度学习(神经网络)的简介 1.深度学习浪潮兴起的三大因素 深度学习(神经网络 ...

  4. pwn学习总结(二) —— 基础知识(持续更新)

    pwn学习总结(二) -- 基础知识(持续更新) Canary PLT表&GOT表 格式化字符串漏洞 GCC编译参数 ASLR 危险函数 输入流 syscall条件 shellcode 其它 ...

  5. JDBC 学习笔记(一)—— 基础知识 + 分页技术

    2019独角兽企业重金招聘Python工程师标准>>> 本文查阅方法:     1.查阅目录 -- 查阅本文目录,确定想要查阅的目录标题     2.快捷"查找" ...

  6. 学习插画前期需要什么基础知识?插画师入门基础先学什么?

    学习插画前期需要什么基础知识?插画师入门基础先学什么?零基础到插画师需要学多久?想必这些问题都是初学者比较伤脑筋的问题,那么初学者学习插画前期需要什么基础知识呢?今天小编就在网络上收集整理了关于插画师 ...

  7. 【Python学习笔记】第一章基础知识:格式化输出,转义字符,变量类型转换,算术运算符,运算符优先级和赋值运算符,逻辑运算符,世界杯案例题目,条件判断if语句,猜拳游戏与三目运算符

    Python学习笔记之[第一章]基础知识 前言: 一.格式化输出 1.基本格式: 2.练习代码: 二.转义字符 1.基本格式: 2.练习代码: 3.输出结果: 三.输入 1.基本格式: 2.练习代码: ...

  8. 学习人工智能需要掌握哪些基础知识,需要具备哪些数学和编程技能?

    学习人工智能需要掌握以下基础知识: 数学基础:线性代数.概率论.微积分.优化等基本数学知识是人工智能领域的重要基础. 编程基础:熟悉至少一种编程语言(如Python.C++等),了解基本的数据结构和算 ...

  9. 学习光盘刻录必备基础知识

    学习光盘刻录必备基础知识 2011年04月11日 [b] 学习光盘刻录必备基础知识[/b] 日期:2009-10-10 11:04 1.什么是CD-R? CD-R就是光盘刻录片(CD Recordab ...

最新文章

  1. psnr 与 ssim评测步骤
  2. 中标麒麟mysql导数据_中标麒麟(linux)mysql配置记录
  3. 如何查看mysql的gtid_汇总丨MySQL GTID技术点,看这一篇就够了!
  4. 《101 Windows Phone 7 Apps》读书笔记-BABY MILESTONES
  5. phpcms v9 数据源
  6. js javascript 判断字符串是否包含某字符串,String对象中查找子字符,indexOf
  7. tikz画GPS卫星电文通信结构图
  8. springMVC实现json 返回到页面
  9. 京东物流数据安全体系
  10. 语言处理 之 fastspeech2,ar,nar研究
  11. 计算日期差(C/C++实现)
  12. spark 终止 运行_如何在数据源运行ou时停止spark流
  13. python输出中文加数字_Python实现阿拉伯数字加上中文数字
  14. 上网行为管理_上网行为管理如何预防以及屏蔽勒索病毒攻击
  15. Golang的reflect
  16. MATLAB下载html页面
  17. QQ圈子,是在这里在一起,还是在那时在一起?
  18. 360等中概股借壳回归之路,亦是赌徒赌壳之时
  19. 常用优化器(Adam SGD)算法
  20. JAVA代码添加License

热门文章

  1. qml 滚动控件Scroll ScrollBar ScrollIndicator ScrollView
  2. 惠普HP DeskJet Ink Advantage 2778 驱动
  3. mysql limit会扫描全表_为什么用了limit还会进行全表扫描?
  4. python时间序列分解STL
  5. 微信公众号开发-账号类型
  6. 计算机屏幕出现条纹w7,电脑屏幕出现条纹,教您电脑屏幕出现条纹闪烁怎么解决...
  7. java与python两个小人动图_CSS Sprite小图片自动合并工具(NodeJS,Python,Java,Ruby)
  8. 负317是几位数在计算机课中,计算机应用基础数据在计算机中的表示ppt课件
  9. 广州大学 计算机网络实验3 使用网络协议分析器捕捉和分析协议数据包 2020版
  10. 北航计算机网络安全,李舟军