web中常规任务:国际化 文件上传 参数传递 类型转换 处理表单的重复提交.
struts2:struts1 + webwork,
1.分离关注:不再将所有任务交给一个人完成,而是将任务拆分,每个任务交给独立的一个组件(拦截器)完成,使得框架更加更加整洁.
更便于维护和管理.
2.struts2实现了应用程序和框架api的解耦,action是pojo.更加容易测试.
struts1和原生的servlet api(HttpServletRequest,HttpServletResponse)耦合在一起,难于测试.
3.struts由于每个实体都会对应一个formbean,所以会造成的类的爆炸,struts2没有actionform组件,使用pojo代替.
4.struts1的action是单利的,数据不是线程安全的.struts2中的action是原型,每个线程独占访问action实例,不会造成并发访问,
因此struts2的action是数据线程安全的.
5.struts1是基于servlet的,struts2是基于filter.
webwork:
struts1配置文件:
<struts-config.xml>
<form-beans>
<form-bean name type="...UserForm" />
</form-beans>
<action-mappings>
<action path="/xx"
name="userForm"
scope="request|session"
validate="true"
input="/xxx.jsp"
type="....RegAction">
<forward name path="/xxxx.jsp" />
</action>
</action-mappings>
</struts-config>
struts-html.tld:回显数据
struts-bean.tld:输出数据,jstl <c:out>
struts-logic.tld:逻辑标签库,逻辑判断的.
1.action寻找
2.formBean处理
3.封装参数信息
4.校验处理
5.跳转到input页面
6.实例化action
7.调用action方法
8.解析actionForward
9.跳转
mvc:
control:ActionServlet Action.
<>
<action path="/"
parameter="method"
type="..XxxAction">
url:http://.../XxxAction.do?method=save
spring:aop,降低耦合.
使用struts2进行web开发
1.创建web项目.
2.引入struts2类库
${struts2解压目录}/apps/struts2-blank-2.1.8.1.war/web-inf/lib/*.jar
3.创建action(pojo)
package cn.itcast.struts2.action;
/**
* HelloWorldAction
*/
public class HelloWorldAction {
public String execute() {
System.out.println("hello world");
return null;
}
}
4.创建src/struts.xml配置文件
dtd:struts-core.jar/struts-2.1.7.jar/30行
<?xml version="1.0"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<package name="HelloWorldPkg" namespace="/HelloWorld">
<action name="HelloWorldAction" class="cn.itcast.struts2.action.HelloWorldAction" />
</package>
</struts>
5.配置web.xml文件的过滤器-org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<filter>
<filter-name>action</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>action</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
6.测试.
struts1文件上传:
UserForm{
//struts1提供的FormFile
FormFile photo ;
}
<form enctype="multipart/form-data" method="post">
<input type="file" name="photo" />
</form>
text/html,image/jpeg contentType="".
<global-forwards>
<forward name="404" path="/xxx.jsp" />
</global-forwards>
http://www.javalearns.com/
请求转发:共享数据,只能转发到当前应用上的路径上.
重定向: 不能共享数据,重定向到任意url.
struts2包搜索顺序:
http://localhost:8085/lsn_struts2/HelloWorld/aaa/bbb/HelloWorldAction.do?name=tom [url:ActionMapper->ActionMapping]
http://localhost:8085/lsn_struts2/HelloWorld/aaa/HelloWorldAction.do?name=tom
http://localhost:8085/lsn_struts2/HelloWorld/HelloWorldAction.do?name=tom
Struts2:
Action位于模型层,action可以携带数据(实例变量).
Ognl:Object Graph navigator language,对象图导航语言. el:
page --> request --> session -->application
struts2:ValueStack,
ActionContext:是线程本地化的.
Queue:队列,先进先出.
Stack:栈,先进后出.ArrayList,
Spring:
service层面上实现事务管理:
1.编程式:硬编码方式
2.声明式:aop xml
struts2中阻止某些方法进行校验:
1.@SkipValidation
2.validateReg|validateDoReg
3.通过覆盖拦截器参数的形式.
<!-- 注册Action -->
<action name="RegAction_*" class="cn.itcast.struts2.action.RegAction" method="{1}">
<result name="success">/success.jsp</result>
<result name="regView">/reg.jsp</result>
<result name="input">/reg.jsp</result>
<interceptor-ref name="defaultStack">
<!-- 排出的方法 -->
<param name="validation.excludeMethods">input,back,cancel,browse,toReg</param>
</interceptor-ref>
</action>
struts2中文件上传:
1.上传多个实用数组即可.
2.阻止哪些文件能上传.(通过扩展名方式 + 通过内容类型方式.)
静态参数拦截器:
<action name="RegAction_*" class="cn.itcast.struts2.action.RegAction" method="{1}">
<param name="uploadDir">d:/kkk</param>
</action>
静参拦截器在参数拦截器之前执行,所以参数拦截器覆盖静参拦截器的值.(取决于顺序配置)
struts2:servletConfig.
httpServletRequest.getAttribute();
Map.get("");
http://www.javalearns.com/
ajax:同步消息.
struts2 ognl 表达式:
<s:textfield name="names" label="UserNames"/>:数据不能正确回显
<s:textfield name="ages[0]" label="UserAges"/>:可以正确回显.
hibernate:
Customer{
Address ca ;
Address ha ;
}
<hibernate-mapping>
<class name table lazy >
<id ..>
<component name="ha" class="...Address">
<property name column type />
</component>
</class>
<logic:iterator>
s:i18n:指定某一个文件:
allUsers{age > 25};
select * from customers;
select id,name from customers;//投影查询
Dispatcher://只能转发到另外的jsp或者是servlet.
request.getDispatcher("/xxx.jsp").forward(request,response);
redirect:从定向,可以从定向到任意url.
对于站内的从定向,需要以"/"开头,结果类型类会解析该url封装成ActionMapping,同时自动在前面追加ServletConext[lsn_struts2]
response.sendRedirect("http://www.gogle.com");
chain:相当于action之间的请求转发,栈中含有所有所涉及的action对象.
response.setContentType("text/plain");
ServletOutStream sos = response.getOutsteam();
sos.write(".dddd");
response.setContentType("image/jpeg");
ServletOutStream sos = response.getOutsteam();
sos.write(byte[]);
ModelDriven:
模型驱动,方便对所有action的模型对象进行批处理.
典型是在拦截器完成.
eq:
MyInterceptor{
Object o = invocation.getAction();
if(o instanceof ModelDriven){
Object model = ((ModelDriven)o).getModel();
sysout(model.getClass());
}
}