Struts2 是什么?
是一个扩展的用来建立企业级JAVA WEB应用程序的框架,不但注重程序的开发程序,更注重部署和后期维护.
Struts2 使用OGNL可以访问值栈,OGNL对集合和索引属性的支持非常强大
Struts2核心控制器
在Struts2中,核心控制器是Filter,而不是一个不同的servlet,为了实现AOP概念
Struts框架的组成:
核心控制器FilterDispatcher(Struts2系统给的),业务控制器和用户事项的业务逻辑组件(用户自己提供)
######Struts 2框架获得了*.action请求后,将根据*.action请求的前面部分决定调用哪个业务逻辑组件,例如,对于login.action请求,Struts 2调用名为login的Action来处理该请求。
Struts 2应用中的Action都被定义在struts.xml文件中,在该文件中定义Action时,定义了该Action的name属性和 class属性,其中name属性决定了该Action处理哪个用户请求,而class属性决定了该Action的实现类。
数据流程图(执行流程)
HTTP请求----->核心控制器(web.xml)---Struts.xml---->Action--->IOC方法注值---->Action调用业务逻辑处理业务逻辑(3层)--->JSP()返回result)--->HTTP响应到客户端
1、客户端浏览器发出HTTP请求。
2、根据web.xml配置,该请求被FilterDispatcher接收。
3、根据struts.xml配置,找到需要调用的Action类和方法, 并通过IoC方式,将值注入给Aciton。
4、Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。
5、Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面。
6、返回HTTP响应到客户端浏览器。
为什么要用Struts2框架?
Struts2是基于MVC的轻量级的web应用框架
Struts配置文件优先级
Web.xml > struts.properties >struts.xml
Method的用处?为什么要使用Method?
可以在配置文件中配置Action的时候用method=来指定执行哪个方法
也可以在url地址中动态指定(动态方法调用DMI)(推荐)
Struts2 type属性(转发和重定向的区别)
详请:
转发: 转发是服务器行为(浏览器上的网址不变)
客户浏览器发送http请求——>web服务器接受此请求——>调用内部的一个方法在容器内部完成请求处理和转发动作——>将目标资源发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。
重定向:客户端行为(浏览器上的网址改变)
客户浏览器发送http请求——>web服务器接受后发送302状态码响应及对应新的location给客户浏览器——>客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址——>服务器根据此请求寻找资源并发送给客户。在这里location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。
正文
重定向其实是两次request
第一次,客户端request A,服务器响应,并response回来,告诉浏览器,你应该去B。这个时候IE可以看到地址变了,而且历史的回退按钮也亮了。重定向可以访问自己web应用以外的资源。在重定向的过程中,传输的信息会被丢失。
请求转发
是服务器内部把对一个request/response的处理权,移交给另外一个对于客户端而言,它只知道自己最早请求的那个A,而不知道中间的B,甚至C、D。传输的信息不会丢失。
转发到action用chain
重定向到action用redirectAction
重定向:
发送请求 -->服务器运行-->响应请求,返回给浏览器一个新的地址与响应码-->浏览器根据响应码,判定该响应为重定向,自动发送一个新的请求给服务器,请求地址为之前返回的地址-->服务器运行-->响应请求给浏览器
转发:
发送请求 -->服务器运行-->进行请求的重新设置,例如通过request.setAttribute(name,value)-->根据转发的地址,获取该地址的网页-->响应请求给浏览器
在Struts2 中获取请求参数
1.属性驱动
(1)方式一:直接将action做一个model,就可以得到请求参数.
问题1:action封装请求参数,会不会存在线程安全问题?
不会:因为每一次请求,都是一个新的action。
缺点:需要单独定义javaBean,将action中属性copy到javaBean中。
优点:简单。
这种方式 ,底层是通过反射来实现的。
(2)方式二:在action中声明一个model。
private User user;提供get/set方法
在页面上使用ognl来描述
优点:简单,解决了第一种封装的问题
缺点:在页面上使用了ognl表达式,页面不通用了。
问题:这种方式,数据是怎样封装的?
是通过struts2中的interceptor进行了数据封装.
2.方式三:模型驱动(在开发中应用比较多)
步骤:
1.让action类实现ModelDriven
2.重写getModel方法
3.在action中实例化一个model对象,让getModel方法返回这个对象。
优点:解决了属性驱动存在的问题
缺点:一次只能封装一个model对象.
Struts2 的Action中取得请求参数值的几种方法
方法一:当把参数作为Action的类属性,且提供属性的getter/setter方法时,xwork的OGNL会自动把request参数的值设置到类属性中,此时访问请求参数只需要访问类属性即可。
方法二:可以通过ActionContext对象Map parameterMap=context.getParameters();方法,得到请求参数Map,然后通过parameterMap来获取请求参数。需要注意的是:当通过parameterMap的键取得参数值时,取得是一个数组对象,即同名参数的值的集合。
方法三:通过ActionContext取得HttpServletRequest对象,然后使用request.getParameter("参数名")得到参数值。
Struts2数据校验
1>编程式校验
2>声明式校验(编程常用)