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

Java之Struts——实现Struts配置文件的简化

2019-03-13 23:50 281 查看

1、设置全局视图
(1)所有的Action路径指向相同的视图时,可以定义全局视图进行转向处理。

<global-results>
<result name="fail" type="redirect">fail.jsp</result>
</global-results>

在购物车中 我们发现在 xml 文档的 配置中出现了很多相同的 Fail.jsp这个时候 就可以用全局视图

意味着 就出现一次 我个人理解 就像一个指 把所有的失败类型全部都指向 同一个处理页面

未完待续…
在用Global之后 我们发现这个只能代替省略失败的次数 我们还是需要写很多的Action的配置文件
新的方法产生 用标识符 " _ " 来通用代替 不过这对于我们 的命名规则就要求的十分严格 因为就是通过统一的命名规则 Struts框架来帮我们完成一些事情

1、动态方法调用
2、通配符优化
(1)约定式配置,约定一种路径的访问规则,在配置文档中使用*替代路径中指定的名称
<action name="*_*" class="包名.{2}Action" method="{1}">
....
</action>
1)第一个*号描述方法名,第二个*描述实体类名
例如:访问路径为check_Users:第1个*被check替代,为执行方法名称
第2个*被实体类名替代,为实体类名称
2){1}表示第一个*的位置,{2}表示第2个*的位置
3)result的转向类型只能使用redirect
<result name="xx" type="redirect">路径</result>
(2)优点是不用维护配置文档

以上注意的就是result 的转向类别 只能用redirect

最后一种 也就是最经常使用的 就是 通过注解的方式来实现命名规则

1)使用注释的方式描述在配置文件中定义的描述信息
(2)@Action的形式描述<action>节点的配置
(3)@Result替代struts配置中的<result>
(4)@Package替代struts配置中的<package>
(5)注解在Action类中的配置语法
@Action(value="访问路径",results={
@Result(name="xxx1",location="目标路径1",type="redirect"),
@Result(name="xxx2",location="目标路径2",type="其他转向方式")
})
public String 执行方法名(){
....
return "xxx1";
}

此方法就不用理会配置文档

注释文档需要在 执行方法前面

Struts 跟 web相同 在实现 数据的传递过程中都存在需要将数据进行一定程度的转化
例如: 我们经常需要将输入的日历格式 转换为字符串的形式 这时候就需要使用到 Struts 的类型转化

1、类型转换的意义
将界面数据转为实体类的属性对应的类型或者将实体类属性的类型转为界面要呈现的类型。

2、类型转换器的开发步骤
(1)编写类型转换器类继承DefaultTypeConverter类
(2)重写(覆盖)converterValue(...)方法
(3)编写类型转换的属性文件:Action类名-conversion.properties
此文件与Action类在同一包中!!
内容:
属性=包名.类型转换类名

在我看来 这是关于过滤器的某种方法 过滤器在拦截到数据以后 在过滤器中实现数据的转化

在继承了DefaultTypeConverter方法后 进行自定义重写 与之不同的是
需要重新创建一个文件 进行对某一个Action 需要此转化方法的声明 且此文件都需要跟Action 处于一个包下
声明格式 :: Action类名-conversion.properties

日历转化的代码分析

package com.converts;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;

public class BirthdayConverter extends DefaultTypeConverter {
@Override
public Object convertValue(Map<String, Object> context, Object value,
Class toType) {
System.out.println("正在转换类型......");// 继承含有三个参数的方法 ConvertValue方法
//     现有的数据   需要转化成哪一种目标类型
SimpleDateFormat sf=new SimpleDateFormat("yyyyMMdd");

if(toType==Date.class){//字符串向日期转换 == 如果目标
System.out.println("字符串转日期......");
//获取要转换的日期字符串
String[] strdates=(String[]) value; // 将需要转化暂时存放在数组中
System.out.println("要转换的日期字符串为:"+strdates[0]);
try {
Date date=sf.parse(strdates[0]); // 进行转化
return date;// 返回转化过的日历格式
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}else{ // 如果是另外的形式
if(toType==String.class){//日期转字符串
System.out.println("日期转为字符串......");
Date date=(Date) value;// 直接转化
return sf.format(date);

}
}

return super.convertValue(context, value, toType);
}
}

三、struts2获取web容器中作用域对象
1、使用ActionContext类获取
1)获取request对象
ActionContext ctx=ActionContext.getContext();
ctx.put(“键名”,值对象);

2)获取HttpSession对象
Map<String,Object> session=ActionContext.getContext().getSession();
session.put("键名",值对象);

3)获取ServletContext对象(application)
Map<String,Object> application=ActionContext.getContext().getApplication();
session.put("键名",值对象);

项目实战:
实现一个图片文件的上传:
首先与Web中相同的是都需要做 表单属性的配置
enctype=“multipart/form-data” 媒体文件接收 或者 数据接收

enctype="multipart/form-data"  媒体文件接收 或者 数据接收
2、表单元素中
<input type="file" name="文件类型属性名称">
3、在Action类的属性中必须存在三个属性,分别为:
private File 文件类型属性名;
private String 文件类型属性名ContentType;
private String 文件类型属性名FileName;

4、上传文件
FileUtils.copyFile(文件类型属性名,服务器端放置上传文件的目标路径);
package com.action;
import com.bean.*;

import java.io.*;
import java.util.*;

import javax.servlet.http.HttpSession;

import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
public class PhotoAction {
private Photo photo;
private String path;
public Photo getPhoto() {
return photo;
}
public void setPhoto(Photo photo) {
this.photo = photo;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}

public String upload(){
//获取服
4000
务器的物理路径
String realpath=ServletActionContext.getServletContext().getRealPath("/");
//获取sessin
HttpSession session=ServletActionContext.getRequest().getSession();
//将图片放在List集合中 用session 保存
List<Photo> lspt=(List<Photo>) session.getAttribute("lspt");
if(lspt==null){
lspt=new ArrayList<Photo>();
}
// list 是接口 ArrayList 是实现类  这防止出现空指针异常

//获取上传文件的名称
String fname=photo.getPicFileName();
if(fname.lastIndexOf(".")!=-1){//判断是否存在后缀
**//获取后缀名称==  判断. 后面是不是 有字符 有的话**
String ext=fname.substring(fname.lastIndexOf("."));
**//这两句 是进行是否JPG格式 判断**
if(ext.equalsIgnoreCase(".jpg")){
//改名
String newfname=new Date().getTime()+ext;
//创建文件对象,设置上传文件存储的路径
File destFile=new File(realpath+"/uppic/"+newfname);

try {
FileUtils.copyFile(photo.getPic(), destFile);//存放图片到指定路径
photo.setFname(newfname);
lspt.add(photo);// **list 集合收取 photo 对象**
session.setAttribute("lspt", lspt); **// session 进行收取 lspt 集合**
path="show.jsp";
return "ok";
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

path="index.jsp";
return "fail";
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: