客户端敲一个地址 http://xxxx/webappname/hello.action 浏览器把请求发给tomcat tomcat接收到请求会检查交个哪个webapp处理
找到webapp之后,会参考配置文件 web.xml (filter) 交给struts2的filter处理,会调用它的doFilter,doFilter内部也会参考一个struts.xml文件
首先参考它的namespace,然后找对应的action,(如果action是一个class的话就会找到class的对象;struts2每次访问必定会new这个对象出来;没找到就返回给tomcat)然后找对应的result。找到result之后会把请求foword给对应的jsp文件(/hello.jsp)
这个jsp文件就会把内容反馈给客户端了
(为什么不直接访问.jsp文件? 因为中间进行了一个中转,可以把请求和最后的视图分开,而不像原来那样写死;分开之后的好处,就是想访问别的试图,可以直接改配置文件/hello.jsp这部分,所以更灵活)
namespace命名空间
拷贝的时候改一下工程的web context路径
从ActionSupport继承
路径问题:统一使用绝对路径 1) <head> <base href="<%=basePath>">
2)使用eclipse自动生成的代码 String basePath=....
不用method用动态方法调用DMI
wildcard 通配符,使配置简便(约定优于配置),首先匹配最精确的,多个星号,谁放前面先调谁
<action name="student*" class="xxxxx" method="{1}"> 代表第一个*号
用action的属性接收参数
方法1:在自己的action里定义一个和传递过来的url参数同名的属性,写好get/set方法(实际调的get/set方法名)
方法2:使用DomainModel来接收参数:使用域模型 user 有name age属性。如果变量无法匹配,就无法使用域模型,使用vo do ,dto。 (最常用)
方法3:ModelDriven MVC model view control
简单数据验证 (分析程序执行过程,一条线,先看结果页面的显示,看提交或者链接到哪里,再到后台查对应的处理,再看如何处理) 读源码也要一层层的来,也是一条线 可以运用debug
addFieldError方法,s:fieldError标签
<s:debug> <s:property> 常用,取属性(value stack,context)并展现 value="errors.name[0]"OGNL表达式,取出来的value值是一个数组[name is error]的第0项(去掉中括号)
访问web元素 (request、session、application)
第一种方式:提交name和password交给LoginAction处理,在LoginAction里面初始化了三个map类型的属性:request、session、application,通过ActionContext对应的方法设置这三个值,在处理execute时,往map里面赋值。在struts2处理的过程中会把map的值交给Httprequest对象里。
第1.2种方式:使用标签访问 <s:property value="#request.r1"/> debug里面的说明,可以用#访问
DI dependency injection 依赖注入
IoC inverse of control 控制反转
第二种方式:实现RequestAware、SessionAware、applicationAware接口,对应的setRequest....方法
当一个请求到来时struts2会帮你new出对应的action(LoginAction),并检查是否实现RequestAware接口,若实现 则调用对应的setRequest方法。Struts2是以filter开始,部署在容器里的filter可以拿到对应的HttpRequest对象,并把这个对象放到一个map里,也命名为Request(映射)交给action,因为action里已经初始化了一个request,在调用request的时候,完成了值的传递
第三种方式:如果想用HttpRequest里特殊的方法。
request = ServletActionContext.getRequest();
session = request.getSession();
application = session.getServletContext();
第四种方式:依赖注入 实现ServletRequestAware
模块包含,相当于把文件直接复制在下面
默认action <default-action-ref name="index"></default-action-ref> (可以在访问不存在时使用)
Action总结:从ActionSupport继承,按照约定写好各种方法(add、delete、query),写完后用DomainModel接收参数,如果需要访问session用IoC访问
Result: 可以指定类型,默认dispatcher(运用服务器跳转) 只能跳转到视图,不能跳转到action。redirect也一样
chain可以跳转到action redirectAction客户端跳转到action (前两个常用)
GlobalResult所有的action有共同的结果就可以写到global-results(在这个action里可以共用的结果集),另外一个包extends
带参数的结果集:forward过程,几个action共享同一个值栈,一次request只有一个值栈
<s:property value="#parameters.t"/> 配置struts.xml用${}
书是用来查的,讲设计模式、数据结构的书可以仔细扣。
OGNL表达式:
第一种方式直接用s:property
第二种方式 传参数时只有传user.xxx时,才会帮你构造这个user方法。初始化demainModel可以可以自己new;或者传参数值,但要有默认的参数为空的构造方法 (否则报InstantiationException 实例化错误)
Struts-tags:
1通用标签
a)property
b)set
c)bean
d)include 少用,处理中文麻烦
e)param
2控制标签
a)if else if else
b) iterator
c)subset
3 UI标签
a) theme
Struts2 命名规范
原则:简单就是美
表的命名:不用写项目名称,因为本来就是你自己的项目。不用写所属的表级别,因为太多了不可能全部定义,交给成员自己定义。 命名为_Model 名即可。
字段的命名:保持和属性名一致(尽量不要起名和数据库的命名冲突) id topicId
库名:项目名
用层来划分包:
com.bjsxt.elarning.action:UserAction CouseAction
com.... .model:User .. Couse...
异常处理:throws 然后使用全局处理
拦截器:调用某个action过程中加入拦截器
CRUD (设计和规划) 重点掌握