开发者学堂课程【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;
//
将请求映射到
action
上
Action targetAction=reqToAction(req);
if(targetAction==null)
chain.doFilter(rq,rp);
//
创建
action
对象
try {
object proxyAction=createProxyAction(targetAction. getClasses());
//将用
户
提交的数据
设
置到action的
属
性上
setProperty(req, proxyAction);
//
执行a
ction
的方法
String result=execute(proxyAction, targetAction. getMethod());
这里是个返回值
。
/
/
处理结果
/
/
获取结果对象
Result r = targetAction. getResultMap() . get(result,)
resultExecute(
r
ep
,r
esp
,
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) {
C
lass clzz = proxyAction.getClass();
M
ethod 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());
r
eturn;
}
/
/
将a
ction
的属性设置到r
eq
的a
ttribute
中
Class clzz = proxyAction.getClass();
Field[ ] fds = clzz. getDeclaredFields();
for(Field fd:fds){
f
d.setAccessible(Ture);
r
eq.setAttribute(fd.getName(),fd.get(proAction))
;
f
d.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;
p
ublic String list(){
System.out.println(“name=”+name+”tel=”+tel”email=”+email);
list = new ArrayList<string>();
list add("siggy");
list. add("todayis friday");
l
ist,add(“it is funny”);
r
eturn”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