开发者学堂课程【Java Web开发系列课程 - Struts2框架入门:自定义框架_属性设置】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/537/detail/7331
自定义框架_属性设置
一、自定义框架_属性设置
核心过滤器里:
/
/
已将对应得a
ction
映射到对应请求上。
Action targetAction=reqToAction(req);
/
/
创建a
ction
对象
T
ry
{
O
bjectproxyAction= crteateProxyAction(targetAction.getClasses())
;
/
/将用户提交的数据设置到action的属性上
setProperty(req, proxyAction, targetAction. getClasses());
//
执行a
ction
的方法
/
/
处理结果
}
catch (Exception e){
/
/TODO Auto-generated catch block
e
.printStackTrace();
}
创建 action 对象是几个步骤里最简单的。接下来创建 action 对象。去做件事情,返回的是 Object 对象。crteateProxyAction 只是代用的 Actionx 型,不是真正的 Action 型,当然这里是真正的 Action 型。
String className 创始人建立的,应先判断一下。当名字等于空时,就会报错。在framework.xml 里,就会不显示 class。
<?xml version="1.0" encoding="UTF-8"?>
<framework>
<action name= "hello"class
=
"cn.sxt.action.HelloAction"
<result name= "success "type="redirect ">/index. jsp</result>
<result name= "failed"type="redirect">/ index. jsp</result>
</action>
</ framework>
办法一:
在解析时不给报错,继续运行。
办法二:
在private Object crteateProxyAction(String className){
时就报错,
接着就去获得 Class clzz = Class.forName(className)
;
。给它后,通过它创建对象。防止异常,用 Exception。接着正常调用,取名为 O
bject proxyAction=
,将这个方法调用。
调用方法的参数是根据 Action targetAction=reqToAction(req)
;
目标上得到的。
接着处理异常,将异常往外处理。将将用户提交的数据设置到 action 的属性上、执行action 的方法、处理结果放入异常里。说明已将将用户提交的数据设置到 action 的属性上,接着就会处理事情。接着讲解将用户提交的数据设置到 action 的属性上。
思考问题:
现将数据传给 Action 对象,对象会传给 proxyAction ,给 proxyAction 设属性,就要将对象给 proxyAction,这是第一。现数据在HttpServletRequest req = (HttpServletRequest)rq;
的对象里,现要将数据设入O
bject proxyAction
,就要通过 class 进行设置。
理论上要把 class 传给
private void setProperty(HttpServletRequest req, Object obj,),
现没有 class,就转 className 给
private void setProperty(HttpServletRequest req, Object obj,)
。
调setProperty 方法,
传 req, proxyAction, targetAction. getClasses
给 setPropert。首先用户提交哪些参数,是 Map 对象,将 Map 对象取出。取出后,它的本质是用于存放尺寸,前面是尺寸,后面是数据。将 Map 数据解代,得到K型,接着写 Object,接着测试。
C
onsole:
java. lang. ClassNotFoundException:
at org. apache. catalina. loader . WebappClassLoader . loadClass (WebappClassLo
at org.apache. catal ina. loader . WebappClassLoader.loadClass (WebappClassLo;
at java. lang. class. forName(Native Method)
at java. lang. Class. forName(Class . java:171)
at cn. sxt. filter . CoreFilter. createProxyAction(CoreFilter. java:64)
没有找到对象,报出异常。将对象写出,因为需要对象传参。做简单属性处理。接着重新启动,得出 pwd 和 name,Y 是数组,所以只需获取 K。不用取里面的数组。接着刷新,得到 ped---1111和 name---zhangsan。因为 keySet 没有顺序,所以 pwd 和name 不用管顺序。将数据取出后,将数据给对象 obj。首先创建 class 这样String className 就不用传了。用一次即可,得到 Object。
H
elloAction.java:
package cn. sxt. action;
public class HelloAction {
private String name ;
private String pwd;
publice String execute() {
System. out . println(name+"----"+pwd) ;
return “success";
public String getName() {
return name ;
}
public void setName(String name) {
this . name
=
name ;
}
public String getPwd() {
return pwd ;
public void setPwd(String pwd) {
this . nwd=nwd:
C
onsole:
2015-8-21 9:33:04 org. apache. catalina.startup.Catalina start
信息: Server startup in 893 ms
pwd---[Ljava. lang . string;@40363068
name---[Ljava. lang. String;@25a41cc7
/ /
获
得清求名
String reqName-path. substring( path.1astIndex0f("/")+1, path.lastIndereturn ActionMapper . actionMap. get(reqName);
}
private Object crteateProxyAction(String className)throws Exception{
Class clzz = Class.forName(className)
;
Return clzz.newInstance();
}
//将用户提交的数据设置到 action 的属性上—
简化很多
private void setProperty(HttpServletRequest req, Object obj, String className)
/
/
创建c
lass
Class clzz=obj.getClass();
Map map=req. getParameterMap();
for(Iterator iter = map. keySet(). iterator();iter . hasNext();){
object key=iter .next();
/
/
根据提交参数去找F
ield
当 Field 为空时,不用作或报异常。先将异常往外抛。不为空往下走,进行赋值。不知道 obj 是什么对象用 obj。
若想做好,在F
ield field = clzz.getDeclaredField(key.toString())
;
判断类型,是 inter 给 inter,double 给 double,便于进行类型转换。
F
ield field = clzz.getDeclaredField(key.toString())
;
if(field==null){
continue;
}
field.setAccessible(true);
/
/
在这进行设值时,要进行相应的类型转换---省略了
field.set(obj, req. getParameter(key . toString()));
field. setAccessihlel
(
false):
field.set(obj,value)
System. out . println(key+”---“+rep.getParmeter(key.toString()));