自定义框架_最后处理 | 学习笔记

简介: 快速学习自定义框架_最后处理,介绍了自定义框架_最后处理系统机制, 以及在实际应用过程中如何使用。

开发者学堂课程【Java Web开发系列课程 - Struts2框架入门自定义框架_最后处理】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/537/detail/7332


自定义框架_最后处理

 

一、自定义框架_最后处理

setProperty(req, proxyAction);设置到储存后,去执行 action 方法。

一旦执行 action 方法要有对象 Object,调用 execute 方法。Action 方法被执行,将方法名传给 proxyAction,现 execute 方法不存在,所以去创建。

private void execute(object proxyAction, String method) 放到下面。

接着写出 class,接着执行方法,要先获得对象,接着给方法名,因没有参数,所以不给参数。

然后导入,将异常往外抛。接着去执行方法,得到 Method 对象,m.invoke 去执行,没有参数,所以都要执行参数,所以这个方法就执行完了。执行完后去测试,如果大部分数据处理完,说明大部分框架已搭好。

得到数据,说明 action 被执行。数据是在前面被输出。接着去处理结果,result 处理,将结果的类型给它,意味着要将 rep、resp 给它。

接着得到 result 对象,

result 对象等于targetAction. getResultMap() . get(result,)) ;也可以去获取对象。

如果还有对象直接给它,要把 proxyAction 给它。这是无参,要写有参。将 void 改成 String,因必须要有结果,action 必须有结果,在 m 前加 return 后强转。

然后去处理结果,

创建private void result Execute (HttpServletRequest req,
HttpServletResponse resp, Result r, Object proxyAction) {这个方法,把这个方法放最后。

HttpServletRequest req=(HttpServletRequest)rq;HttpServletResponse resp =(HttpServlet Response)rp;

//将请求映射到actionAction targetAction=reqToAction(req);

if(targetAction==null)

chain.doFilter(rq,rp);
//创建 action 对象try {object proxyAction=createProxyAction(targetAction. getClasses());

//将用提交的数据置到action的性上setProperty(req, proxyAction);
//执行action的方法

String result=execute(proxyAction, targetAction. getMethod());这里是个返回值
//处理结果

//获取结果对象

Result r = targetAction. getResultMap() . get(result,)

resultExecute(rep,resp r, proxyAction)}catch (Exception e) {

e.printStackTrace();

}

Fleld field = clzz.getDeclaredFiela(key.toString());if(field==null){continue;}field. setAccessible(true);
//要进行相应的类型转换--- 省略了field.set(obj, req. getParameter(key . toString()));field. setAccessible(false);System.out . print1n(key+"---"+req. getParameter(key . toString()));

}

}/ /执行action的方法private String execute(Object proxyAction, String method) {

Class clzz = proxyAction.getClass();

Method m=clzz.getDeclaredMethod(method)

return(String)m.invoke(proxyAction);

}

}

pwd--- 1111

name- - - zhangsan

zhangsan----1111

首先去处理结果,先去判断结果类型。如果是重名项,容易。

难点在于转发。转发麻烦在要把属性全部放到 String 对象里,要不然前面就会出错。要去设置,第一部将值取出。

将 action 取出,根据其所有属性取出。写出 Class clzz 映射,取出后,将把 Field 的数组拿出。

刚才的值是通过 Method,但不能再通过 Method 获得,因为 action 的属性得出的属性会比得出 Method 的多。比如查重出来的 List,是提交不过来的,是查询后的。

所以只能通过 String 取别的属性,所以去将属性取出。将属性取出后,就要将属性及属性的值给 Request。设置时,名称等于 fd.getName。对应的值为 proxyAction 的值。将 fd.get(proAction 值取出,往外抛,这样就全部放到了 Request 里。

接着调用,处理结果。请求到 Action 对象,判断 Action,如果 Action 是不等于空的话,直接跳转。然后当它走完过程后,就不需要走回去,说明已经执行完了。请求完后,将 Name 取出,跳到*framework.xml 里。

fleld. setAccesslble(talse);

}

}/ /执行action的方法private String execute(Object proxyAction, string method) throws Securit

Class clzz = proxyAction.getclass();Method m=clzz.getDeclaredMethod(method);return (String)m. invoke(proxyAction);

}

//处理结果private void resultExecute(HttpServletRequest req ,HttpServletResponseresp Resultr, Object proxyAction) {

if(“redirect”.equals(r.getType))){

resp.sendRedirect(r.getLocation());

return;

}

//将action的属性设置到req的attribute

Class clzz = proxyAction.getClass();

Field[ ] fds = clzz. getDeclaredFields();

for(Field fd:fds){

fd.setAccessible(Ture);

req.setAttribute(fd.getName(),fd.get(proAction))

fd.setAccessible(false);

}

req. getRequestDispatcher(r . getlocation()) . forward(arge, resp)

package cn. sxt. action;public class HelloAction {private String name ;private String pwd;private List<String> list;public string execute( ){System. out. println(name+"---- "+pwd);return "success";

}public String getName() {return name ;}public void setName(String name) {this. name = name;

}

*framework.xml

<?хml vеrѕіоn= "1.Ѳ" еnсоdіng= "UТF-8"?>

<framework><action name= "hello" class="cn. sxt. action. HelloAction">

<result name= "success" type="dispatcher">/index. jsp</result><result name= "failed" type= "redirect ">/ index . jsp</result>

</action></framework>

跳转到*index.jsp:

<tltle>My JSP’ index.Jsp’ startingpage</title><meta http- equiv= "pragma" content= "no-cache"><meta http-equiv= "cache-control" content= "no-cache"><meta http-equiv="expires" content= "O"><meta http-equiv= "keywords " content= "keyword1, keyword2, keyword3">

<meta http-equiv= "description" content="This is my page"><!---<link rel="stylesheet"type="text/css"href="styles.css"

--></head><body><form action=”list.action”method=”post”>

用户名:<input type=”text”name=”name”/><br>

电话:<input type=”text”name=”tel”/><br>

邮箱:<input type=”text”name=”email”/><br>

<input type=”submit”value=”提交”/>

</form>

</body>< /html>
接着刷新,没跳转,有报错。因为没有设取值,现非法将权限设置。接着刷新,通过。

用户名:zhangsan

密码:1111

重新写代码。不能用 age,因为没有处理类型转换。List 无所谓,只要是对象就行。接着生成。使用 public String list 的方法,将 list 的值取出。因没有处理乱码,所以将写成 it is funny。将参数导入。配置一个 action 型。有默认值可以不写。

import java.util.ArrayList;

import java.util.List;

public class User{

private String name ;private String tel;private string email ;

private List<String>list;

public String list(){

System.out.println(“name=”+name+”tel=”+tel”email=”+email);

list = new ArrayList<string>();

list add("siggy");

list. add("todayis friday");

list,add(“it is funny”);

return”success”;

}public String getName(){return name ;

}public void setName(String name) {this.name = name;}public String getTel() {return tel ;}

public void setTel(String tel) {

this.tel = tel;

}public String getEmail() {return email;

}public void setEmail(String email) {

this. email = email;

}

}

*framework.xml

<?хml vеrѕіоn= "1.Ѳ" еnсоdіng= "UТF-8"?>

<framework><action name= "hello" class="cn. sxt. action. HelloAction">

<result name= "success" type="dispatcher">/index. jsp</result><result name= "failed" type= "redirect ">/ index . jsp</result>

</action>

<action name=”List”class=”cn.sxt.action.UesrAction”method=”List”>

<result>/list.jsp</result>

</action></framework>

接着调整页面,叫做提交的页面,叫 submit.jsp。第二个页面为显示写 list.jsp。将类型转换全部做好。一定要了解流程。将 list 打出。导出用户名。没有进行类型转换和其他处理。<%@ pagelanguage= "java" import= "java. util. *" pageEncoding= "UTF- 8"%><%@taglib prefix=”c”uri=”http://java.sun.com/jsp/jstl/core” %>String path = request . getContextPath();String basePath = request . getScheme()+" ://"+request. getServerName()+":"+treque<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html ><head><base href="<%=basePath%> "><title>My JSP ' index.jsp' starting page</title><meta http-equiv= "pragma" content= "no-cache"><meta http-equiv="cache-control " content= "no-cache">< meta httn-eauiv= "pxnires" content="0">

<meta http-equiv= "keywords " content= "keyword1 , keyword2, keyword3">

<meta http-equiv= "description" content="Thisis my page">

<!--<link rel="stylesheet" type="text/css" href="styles.css">--></head>
用户名:${name}<br>

电话:${tel}<br>

邮箱:${email}<br>

<c:forEach items=”${list}”var=”bean”>

${bean}<br>

</c:forEach><body>

localhost:8080/framework/submit.jsp

image.png

相关文章
|
Java 微服务 Spring
spirngCloud框架-概述篇
spirngCloud框架-概述篇
|
XML 前端开发 Java
如何实现自定义MVC框架(进阶版本)
如何实现自定义MVC框架(进阶版本)
31 0
|
前端开发 Java 数据库连接
“构建高级自定义MVC框架实现CRUD功能的完整指南“
“构建高级自定义MVC框架实现CRUD功能的完整指南“
56 0
|
缓存 Java Spring
Spring 核心方法 refresh 刷新流程简要概述及相关源码扩展实现(二)(下)
Spring 核心方法 refresh 刷新流程简要概述及相关源码扩展实现(二)(下)
86 0
|
存储 XML 缓存
Spring 核心方法 refresh 刷新流程简要概述及相关源码扩展实现(一)(下)
Spring 核心方法 refresh 刷新流程简要概述及相关源码扩展实现(一)
97 0
|
XML 存储 Java
Spring 核心方法 refresh 刷新流程简要概述及相关源码扩展实现(一)(上)
Spring 核心方法 refresh 刷新流程简要概述及相关源码扩展实现(一)
121 0
|
存储 XML 前端开发
Spring 核心方法 refresh 刷新流程简要概述及相关源码扩展实现(二)(上)
Spring 核心方法 refresh 刷新流程简要概述及相关源码扩展实现(二)
75 0
|
XML 存储 前端开发
高级UI系列(一): 自定义UI理论篇(2)
简介: 自定义view是区分中级开发和初级开发的分水岭,虽说今年校招,工作三四年的老程序员一直在劝退客户端,作为职场打拼多年的老菜鸟,对android还是挺有信心的,虽说对view的知识也只是停留在纸上,很少真正落地做一些复杂高性能的ui控件,之前在akulaku确实见识了一群技术大牛,高级ui控件伸手就来,让我羡慕不已,这一次我也从基础到源码再到实战开始写几篇自定义view教程。大家有什么好的见解也欢迎到评论区多多交流。
163 0
高级UI系列(一): 自定义UI理论篇(2)
|
XML 程序员 Android开发
高级UI系列(一): 自定义UI理论篇(1)
自定义view是区分中级开发和初级开发的分水岭,虽说今年校招,工作三四年的老程序员一直在劝退客户端,作为职场打拼多年的老菜鸟,对android还是挺有信心的,虽说对view的知识也只是停留在纸上,很少真正落地做一些复杂高性能的ui控件,之前在akulaku确实见识了一群技术大牛,高级ui控件伸手就来,让我羡慕不已,这一次我也从基础到源码再到实战开始写几篇自定义view教程。大家有什么好的见解也欢迎到评论区多多交流。
171 0
高级UI系列(一): 自定义UI理论篇(1)
|
XML Java 数据格式
自定义框架配置解析 | 学习笔记
快速学习自定义框架配置解析,介绍了自定义框架配置解析系统机制, 以及在实际应用过程中如何使用。
自定义框架配置解析 | 学习笔记