标签:
1.action生命周期
对于每次httpservlet的请求,都会产生一个新的action 的实例
name 属性在struts2中有一些默认的比如success和error,input 等 ,当然也可以自己对name属性进行自定义
注:result 除了
<result name="input">index.jsp</result> 可以返回到某一个页面上面
<result name="input">student1</result> 也可以去请求一个路径
————————-分割线
type属性:默认的 dipatcher
redirect 重定向
chain 链
redirectAction 重定向到一个action
3.struts.xml中package中的全局的配置
在package中
<!-- 全局配置 -->
<global-results>
<result name="error">index.jsp</result>
</global-results>
4.如何在action中获取servlet-api 中的 request 和 session 和 response
4.1.通过 ServletActionContext 获取内置对象
HttpServletRequest request = ServletActionContext.getRequest(); //直接获得 request 对象
HttpServletResponse response = ServletActionContext.getResponse();//直接获得response对象
HttpSession session = (HttpSession)ServletActionContext.getContext().getSession();//获取session 对象
Map application = ServletActionContext.getContext().getApplication();//获取application 对象
注: application 这里返回的形式是map类型
4.2 通过Actioncontext 获取内置对象
ActionContext cxt = ActionContext.getContext();
HttpServletRequest request = (HttpServletRequest)cxt.get(ServletActionContext.HTTP_REQUEST);
HttpServletResponse response = (HttpServletResponse)cxt.get(ServletActionContext.HTTP_RESPONSE);
HttpSession session = (HttpSession)cxt.get(ServletActionContext.SESSION); //(HttpSession)cxt.getSession(); Map application = (Map)cxt.get(ServletActionContext.APPLICATION); //(Application)cxt.getApplication();
4.3 通过IOC 方式 获取 内置对象
1.当前的action 实现 SessionAware,ApplicationAware,ServletRequestAware,ServletResponseAware
2.代码示例:
public class LoginAction implements Action,SessionAware,ApplicationAware,ServletRequestAware,ServletResponseAware{
private HttpServletRequest request; //HttpServletRequest型变量request声明
private HttpServletResponse response; //HttpServletResponse型变量response声明
private Map session; //HttpSession型变量session声明
private Map application; //Application型变量application声明
//测试action是否每次新生成的一个实例
// public LoginAction() {
// // TODO Auto-generated constructor stub
// System.out.println(this);
// }
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return "error";
}
@Override
public void setServletResponse(HttpServletResponse response) {
// TODO Auto-generated method stub
this.response = response;
}
@Override
public void setServletRequest(HttpServletRequest request) {
// TODO Auto-generated method stub
this.request = request;
}
@Override
public void setApplication(Map<String, Object> application) {
// TODO Auto-generated method stub
this.application = application;
}
@Override
public void setSession(Map<String, Object> session) {
// TODO Auto-generated method stub
this.session = session;
}
}
—————————-IOC 思想 重点
http://stamen.iteye.com/blog/1489223/
IOC :控制反转(Inversion of Control,英文缩写为IoC)
控制反转一般分为两种类型,依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。依赖注入应用比较广泛。
IoC模式看做是工厂模式的升华,可以把IoC看作是一个大工厂,只不过这个大工厂里要生成的对象都是在XML文件中给出定义的,然后利用Java 的“反射”编程,根据XML中给出的类名生成相应的对象。从实现来看,IoC是把以前在工厂方法里写死的对象生成代码,改变为由XML文件来定义,也就是把工厂和对象生成这两者独立分隔开来,目的就是提高灵活性和可维护性。
主要可以划分为三种类型:构造函数注入、属性注入和接口注入
———————————-小案例
数据展现:详见代码示例
http://kingxss.iteye.com/blog/1622455
5.拦截器 如何自定义拦截器 (重点)
概念:就在请求到某个action的之前或者之后 进行一些拦截 ,拦截器 是AOP的 一种实现方式
AOP面向切面编程, 具体的实现方式还是通过代理模式来实现的
http://www.cnblogs.com/yanbincn/archive/2012/06/01/2530377.html AOP
http://www.blogjava.net/i369/articles/162407.html 拦截器
拦截器看一下struts-defalut.XML
1.自定义拦截器
创建一个类来实现Interceptor 接口
public class MyInterceptor implements Interceptor{
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void init() {
// TODO Auto-generated method stub
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
// TODO Auto-generated method stub
String result = invocation.invoke();
System.out.println(result);
return result;
}
}
2.1 针对某一个action 进行拦截
<package name="zr" extends="struts-default">
<interceptors>
<interceptor name="test" class="com.zr.interceptor.MyInterceptor"/>
</interceptors>
<action name="abc" class="com.zr.controller.ShowController" method="showMsg">
<result name="success">index.jsp</result>
<interceptor-ref name="test"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
</package>
2.2 通过定义拦截器栈 对package下面的所有action 都经过这个拦截器栈
<struts>
<constant name="struts.configuration.xml.reload" value="true"/>
<package name="zr" extends="struts-default">
<interceptors>
<interceptor name="test" class="com.zr.interceptor.MyInterceptor"/>
<interceptor name="test2" class="com.zr.interceptor.MyInterceptor2"/>
<interceptor-stack name="mystack">
<interceptor-ref name="test"></interceptor-ref>
<interceptor-ref name="test2"></interceptor-ref>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="mystack"></default-interceptor-ref><!-- 需要放在action上面-->
<action name="abc" class="com.zr.controller.ShowController" method="showMsg">
<result name="success">index.jsp</result>
</action>
</package>
</struts>
注意: 在引入拦截器栈的时候,需要放在action上面
valueStack 和OGNL (重点)
值栈 就是存储数据的空间 线程安全
Struts2会为每个请求创建一个新的值栈,也就是说,栈和请求是一一对应的,不同的请求,值栈也不一样,而值栈封装了一次请求所有需要操作的相关的数据。
狭义值栈: 狭义值栈主要用来存放动态EL(表达式语言)运算需要的值和结果,当然OgnlValueStack对象主要是用来支持OGNL(对象图导航语言)运算的。
换句话说: 也就 请求action 中产生的数据或者获取的数据,最终都是放到Ation 对应的值栈当中
代码示例:
//狭义的值栈
ActionContext ac = ActionContext.getContext();
ValueStack vs = ac.getValueStack();
vs.set("uname","wwj");
注意:前台页面取值需要用S标签 当然注意要引入S标签
<s:property value="uname"/>
—————–ognl 对象图形导航语言
ognl 对存放的数据进行取值 是一种表达式
request #session #application 后面跟点语法就可以了
注意:这里访问的是actioncontext里面的数据
http://blog.csdn.net/tjcyjd/article/details/6850203/ 参考资料
注意:通过使用#attr 取数据 page - request -session -application
ognl 访问静态方法和属性
1.struts.xml 中配置
<constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
2.页面中使用OGNL表达式访问
<!-- 访问静态属性和方法 -->
<s:property value="@com.zr.controller.MyStatic@name"/><br/>
<s:property value="@com.zr.controller.MyStatic@showMsg()"/>
3.ongl 访问javabean 对象 和 集合 ,Map
模拟数据:
this.setStudent1(new Student(1, "wwj"));
Map<String,Student> s2 =new HashMap<String,Student>();
s2.put("student2", new Student(2,"xyz"));
this.setStudent2(s2);
List<Student> students = new ArrayList<Student>();
students.add(new Student(3,"abc"));
this.setStudents(students);
页面获取:
<!-- 访问对象 -->
对象:<s:property value="student1.sname"/><br>
<!-- 访问集合 -->
集合:<s:property value="students[0].sname"/><br>
<!-- 访问Map-->
map:<s:property value="student2.student2.sname"/
struts2标签
http://www.cnblogs.com/langtianya/archive/2013/03/18/2965878.html 参考资料
http://jimingsong.iteye.com/blog/1582939
根据功能划分: 数据标签 控制标签 界面标签 其它一些标签
优点:比JSTL 强大 缺点 :性能特别低 一般在开发中不太常用
数据标签 :
Propetry 输出值
set 设置值
Bean 定义java对象
Date 日期
Debug调试
url标签
Include 标签
单独 Debug 标签使用 在页面 使用 进行调试 : 看值是否在valueStack中
控制标签:
ifelse 判断标签
Iterator 循环
Append 叠加
Generator 分隔标签
Merge 组合
sort 排序标签
subset 截取标签
循环标签:
<s:iterator var="student" value="students">
<s:property value="#student.sname"/>
</s:iterator>
界面标签:
Form 表单
text 文本
radios 单选
checkbox 标签
select 下拉
其它标签:
UpdownSelect
optiontransferselect
struts2国际化:
http://1250605829.iteye.com/blog/1595275 参考
1.
配置国际化的属性文件
resource_en_US.properties
resource_zh_CN.properties
uname=Uname
upsw=Upassword
2.配置struts.xml文件
<!-- 添加国际化资源文件配置 -->
<constant name="struts.custom.i18n.resources" value="resource"></constant>
value 里面的值 对应 resource(可以随便取)
3.标签都是采用s标签
<s:form id="loginform" action="login" method="post">
<s:text name="uname"></s:text>
<input type="text"/>
<s:text name="upsw"></s:text>
<input type="text"/>
</s:form>
struts2 验证
实现的效果跟我们前台使用js进行验证是一个效果
1.编写提交文件
<s:form id="loginform" action="login" method="post">
<s:textfield name="uname" label="用户名"></s:textfield>
<s:submit value="提交"></s:submit>
</s:form>
2.配置对应的请求验证器XML文件
注意:要保证跟action类同级
比如action 叫做 abc 那么对应验证文件就叫做 abc–validation.xml
编写XML中的验证规则:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<!-- 编写验证 -->
<validators>
<!-- 对哪个字段进行验证-->
<field name="uname">
<!-- 配置必填字符串校验器 -->
<!-- 这里相当于是对字符长度的验证-->
<field-validator type="requiredstring">
<param name="minLength">5</param>
<param name="maxLength">10</param>
<message>对不起长度不满足要求</message>
</field-validator>
</field>
</validators>
3.
如果不满足条件 配置返回结果 为 input 返回你自己验证的页面
提交测试
注:在xwork核心包下面 validator包下面的defalut-xml 可以查询到默认Struts2 为我们提供的验证
注:验证还可以自定义
struts2 文件上传和下载
—————-文件上传
1.编写页面
<!--enctype 必需配置成 这个需要不是针对框架的。文件上传必需有这个 -->
<form action="upload" method="post" enctype="multipart/form-data">
请选择需要上传的文件:<input type="file" name="fname"/>
<input type="submit" value="提交">
</form>
2.配置对应的XML文件=
<!-- 指定允许上传的文件最大字节数。默认值是2097152(2M) -->
<constant name="struts.multipart.maxSize" value="10701096"/>
<!-- 设置上传文件的临时文件夹,默认使用javax.servlet.context.tempdir -->
<constant name="struts.multipart.saveDir " value="d:/tmp" />
(可选)
<package name="zr" extends="struts-default">
<!-- 接收文件上传的请求 -->
<action name="upload" class="com.zr.controller.UploadController" method="upload">
<result name="success">index.jsp</result>
</action>
</package>
3.编写对应的action类
public class UploadController extends ActionSupport{
//通过文件上传,struts2会帮你接受上传的一些数据
//文件 fname 跟 页面中file 定义的name名字一致的
private File fname;
//文件名 必需后缀加上FileName
private String fnameFileName;
//文件类型 必需后缀加上ContentType
private String fnameContentType;
(自行get set)
public String upload(){
//获取服务器的地址 webapps/项目名/users
String path = ServletActionContext.getServletContext().getRealPath("/users");
System.out.println(path);
//将文件拷贝到需要的路径下面
//1.先创建File 对象
File f = new File(path);
//2.执行拷贝的方法 (io组件当中 FileUtils 类 )
try {
//FileUtils.copyFileToDirectory(fname, f);
FileUtils.copyFile(fname, new File(f,fnameFileName));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return SUCCESS;
}
}
—注明 多文件上传也就是接收的参数 为数组
//——————–分割线
//文件
private File[] fnames;
//文件名
private String[] fnamesFileName;
//文件类型
private String[] fnamesContentType;
———————文件下载:
<a href="download">点击我下载</a>
、2.配置Struts.xml文件 接受对应下载请求
<!-- 接受下载的请求 --> 设置返回类型为流的形式
<action name="download" class="com.zr.controller.DownloadController">
<result type="stream">
<!-- 默认是找getInputstream 方法 但是可以配置由哪个方法来处理流-->
<!--这里命名为download 那么anction 中必需方法命名为getDdownload-->
<param name="inputName">download</param>
<!-- 提示用户下载 attachment;filename= 不变 等号跟文件名-->
<param name="contentDisposition">attachment;filename="${filename}"</param>
</result>
</action>
3.编写getDownload的方法 返回类型 是 流
public InputStream getDownload(){
//模拟已经知道文件路径的地址
String fpath = ServletActionContext.getServletContext().getRealPath("/users")+"\\abc.xls";
File f = new File(fpath);
this.setFilename("bcd");
FileInputStream in = null;
try {
in = new FileInputStream(f);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return in;
}
4.测试下载
标签:
原文地址:http://blog.csdn.net/nogfexception/article/details/51743572