Struts2学习笔记(2)
2016-06-23 15:03
549 查看
1.action生命周期
对于每次httpservlet的请求,都会产生一个新的action 的实例
result 中关于name属性的配置和type属性 (struts.xml)
name 属性在struts2中有一些默认的比如success和error,input 等 ,当然也可以自己对name属性进行自定义
注:result 除了
————————-分割线
type属性:默认的 dipatcher
3.struts.xml中package中的全局的配置
在package中
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 获取内置对象
4.3 通过IOC 方式 获取 内置对象
1.当前的action 实现 SessionAware,ApplicationAware,ServletRequestAware,ServletResponseAware
2.代码示例:
—————————-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面向切面编程, 具体的实现方式还是通过代理模式来实现的
/article/5547488.html AOP
http://www.blogjava.net/i369/articles/162407.html 拦截器
拦截器看一下struts-defalut.XML
1.自定义拦截器
创建一个类来实现Interceptor 接口
注册拦截器
2.1 针对某一个action 进行拦截
2.2 通过定义拦截器栈 对package下面的所有action 都经过这个拦截器栈
注意: 在引入拦截器栈的时候,需要放在action上面
valueStack 和OGNL (重点)
值栈 就是存储数据的空间 线程安全
Struts2会为每个请求创建一个新的值栈,也就是说,栈和请求是一一对应的,不同的请求,值栈也不一样,而值栈封装了一次请求所有需要操作的相关的数据。
狭义值栈: 狭义值栈主要用来存放动态EL(表达式语言)运算需要的值和结果,当然OgnlValueStack对象主要是用来支持OGNL(对象图导航语言)运算的。
换句话说: 也就 请求action 中产生的数据或者获取的数据,最终都是放到Ation 对应的值栈当中
代码示例:
//狭义的值栈
注意:前台页面取值需要用S标签 当然注意要引入S标签
—————–ognl 对象图形导航语言
ognl 对存放的数据进行取值 是一种表达式
request #session #application 后面跟点语法就可以了
注意:这里访问的是actioncontext里面的数据
http://blog.csdn.net/tjcyjd/article/details/6850203/ 参考资料
注意:通过使用#attr 取数据 page - request -session -application
ognl 访问静态方法和属性
1.struts.xml 中配置
2.页面中使用OGNL表达式访问
3.ongl 访问javabean 对象 和 集合 ,Map
模拟数据:
页面获取:
struts2标签
/article/4707463.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 截取标签
循环标签:
界面标签:
Form 表单
text 文本
radios 单选
checkbox 标签
select 下拉
其它标签:
UpdownSelect
optiontransferselect
struts2国际化:
/article/3916820.html 参考
1.
配置国际化的属性文件
resource_en_US.properties
resource_zh_CN.properties
uname=Uname
upsw=Upassword
2.配置struts.xml文件
value 里面的值 对应 resource(可以随便取)
3.标签都是采用s标签
struts2 验证
实现的效果跟我们前台使用js进行验证是一个效果
1.编写提交文件
2.配置对应的请求验证器XML文件
注意:要保证跟action类同级
比如action 叫做 abc 那么对应验证文件就叫做 abc–validation.xml
编写XML中的验证规则:
3.
如果不满足条件 配置返回结果 为 input 返回你自己验证的页面
提交测试
注:在xwork核心包下面 validator包下面的defalut-xml 可以查询到默认Struts2 为我们提供的验证
注:验证还可以自定义
struts2 文件上传和下载
—————-文件上传
1.编写页面
2.配置对应的XML文件=
3.编写对应的action类
—注明 多文件上传也就是接收的参数 为数组
//——————–分割线
———————文件下载:
发送请求下载否文件
2.配置Struts.xml文件 接受对应下载请求
3.编写getDownload的方法 返回类型 是 流
4.测试下载
对于每次httpservlet的请求,都会产生一个新的action 的实例
result 中关于name属性的配置和type属性 (struts.xml)
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面向切面编程, 具体的实现方式还是通过代理模式来实现的
/article/5547488.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标签
/article/4707463.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国际化:
/article/3916820.html 参考
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.测试下载
相关文章推荐
- 干货来啦!JAVA常用代码(三)
- Java——分页
- Java中finally块与return之间的执行顺序
- Spring与Mybatis相结合实现多数据源切换功能
- Java基础:多线程
- reverse array java
- reverse array java
- SpringMVC框架
- struts2实现图片的上传以及下载功能
- MyBatis与SpringMVC相结合实现文件上传、下载功能
- java初始化过程中成员变量
- SpringMVC总结之配置
- SpringMVC中使用patchca生成验证码
- jdk环境变量
- 参加java培训的一些心得(学习方法)
- java和jsp四舍五入问题
- spring加载xsd文件 Cannot find the declaration of element 'beans'
- 为servlet、javaee添加源码关联
- 基于spring的shiro配置
- JAVA IO流深入理解