您的位置:首页 > 编程语言 > Java开发

Struts2学习笔记(2)

2016-06-23 15:03 549 查看
1.action生命周期

对于每次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.测试下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: