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

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

开发者学堂课程【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

相关文章
Axure高保真原型设计:移动端多选图片上传
本文介绍了如何在Axure中利用中继器实现移动端应用的多选图片上传功能,适用于如微信、微博等社交平台。文章详细描述了主页面、相册页面和大图页面的制作步骤,并展示了如何通过中继器和交互设置实现图片的选择、上传及删除等功能。此教程有助于提升用户体验和应用功能性。
355 9
|
8月前
|
消息中间件 NoSQL 安全
WePush 一款基于模拟点击实现的微信消息推送机器人,安全稳定不封号
WePush 是一个基于微信 Windows 客户端开发的消息推送系统,采用模拟人工点击技术实现消息发送,具有安全稳定、零封号风险的特点。系统通过 HTTP API 接收消息请求并利用 Redis 消息队列异步处理任务,支持群聊和个人消息推送。依赖 FastAPI、wxauto 和 Redis,适用于系统监控提醒等场景,需使用指定版本微信客户端运行。
915 60
|
设计模式 前端开发 Java
19:Web开发模式与MVC设计模式-Java Web
19:Web开发模式与MVC设计模式-Java Web
314 4
|
存储 缓存 NoSQL
软件体系结构 - 缓存技术(4)Redis分布式存储
【4月更文挑战第20天】软件体系结构 - 缓存技术(4)Redis分布式存储
273 12
【Echarts】Echarts 柱形图实现从右向左滚动
【Echarts】Echarts 柱形图实现从右向左滚动
489 0
|
测试技术 Swift 数据安全/隐私保护
【Swift开发专栏】Swift中的代码重构与模块化
【4月更文挑战第30天】本文探讨了Swift中代码重构和模块化的重要性,旨在提升项目质量。重构改善代码内部结构,提高可读性与可维护性,而模块化降低系统复杂性,增强代码复用。文章围绕代码重构的基本概念、模块化设计原则及Swift特性在两者中的应用展开,强调协议扩展、泛型、SPM和访问控制在实现重构和模块化中的作用。掌握这些技巧对构建高效、可扩展的Swift软件至关重要。
225 2
|
小程序 开发者 Windows
安装VantWeapp开发微信小程序
安装VantWeapp开发微信小程序
411 0
|
开发框架 前端开发 UED
【Flutter前端技术开发专栏】Flutter中的下拉刷新与上拉加载更多
【4月更文挑战第30天】在Flutter移动应用开发中,下拉刷新和上拉加载更多能提升用户体验和用户参与度。通过`RefreshIndicator`组件和`ScrollController`实现下拉刷新与上拉加载。`RefreshIndicator`包裹可滚动Widget,`ScrollController`监听滚动事件以判断是否到达底部。性能优化包括避免重复加载、使用防抖技术和异步加载数据。参考Flutter官方文档和相关教程可进一步学习。
881 0
【Flutter前端技术开发专栏】Flutter中的下拉刷新与上拉加载更多
|
XML Android开发 数据格式
Android EditText 获取/失去焦点
项目的需求中,又一个4位数的验证码界面,小弟才疏学浅,只想到了用线性布局里面放四个EditText。 需求需要输入内容后,自动跳到下一个位置聚焦,删除指定位置后,自动跳到上一个位置聚焦,由于聚焦/非聚焦UI展示得都不同,所以每个editText都会频繁的设置焦点变化。 之前因为是调用的系统键盘,所以,editText和键盘绑定后处理起来非常方便,但是,我们需要自定义一个展示在UI上的数字键盘,于是就有些bug。 bug不难,但是有点杂乱,下面是我的一点解决办法,总结一下,以后也记得更清楚!
|
移动开发 编解码 网络协议
用Java的BIO和NIO、Netty来实现HTTP服务器(三) 用Netty实现
用Java的BIO和NIO、Netty来实现HTTP服务器(三) 用Netty实现