源码分析之struts1自定义方法的使用与执行过程
最近有人问我,你做项目中用户的一个请求是怎么与struts1交互的,我说请求的url中包含了action的名字和方法名,这样就可以找到相应方法,执行并返回给用户了。 他又问,那struts1中有什么方法呢,execute;那怎么能调用到自定义的方法,在请求中指定,在struts-config.xml中配置。。。 接下来他疑惑了,说struts2 是可以以struts.xml中配置方法名的。 是,他说的没错,只是我没有表述清楚struts1自己定义方法的关键点。 下面具体说一下struts1中使用自定义方法及自定义方法执行的过程。
在struts1中我们知道核心的控制器是ActionServlet这个类,那么它负责了获取用户的请求,改变modle状态,返回用户试图,这是MVC模型的一个交互方式。那么他的内部实现是如何的呢? 通常我们在使用struts定义一个action中会继承MappingDispatchAction、LookupDispatchAction,或者直接继承DispatchAction,他们的区别这里暂不做解释。 这里我们直接继承DispatchAction类。如我们的类就叫LoginAction。先上代码
test.LoginAction
public class LoginAction extends DispatchAction{
public ActionForward login(ActionMapping mapping, ActionForm form,
HttpServletRequest resquest, HttpServletResponse response) throws Exception{
//TODO 逻辑
mapping.findForward("login");
}
}
struts-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_3.dtd">
<struts-config>
<form-beans>
<form-bean name="loginFormBean" type="test.LoginActionForm" />
</form-beans>
<action-mappings>
<action name="loginFormBean" parameter="method"
path="/loginAction" scope="request"
type="test.LoginAction">
<forward name="login" path="/index.jsp" />
</action>
</action-mappings>
</struts-config>
login.jsp
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%>
<html>
<head>
<script type="text/javascript">
function subForm(){
document.loginFormBean.submit();
}
</scipt>
</head> <body>
<html:form action="/loginAction.do?method=login" method="post"
onsubmit="return subForm()">
<input type="text" name="name"/>
<input type="password" name="pwd"/>
<input type="button" value="submit" onclick="subForm"/>
</html:form>
</body>
</html>
现在就开始说下struts1是如何找到我们自定义的login这个方法的
我们首先看login.jsp,这个是我们首先访问的页面,它模拟一个登录的操作,那么输入用户名、密码,点击submit后,会执行subForm这个函数,这个函数要做的就是执行path为"/loginAction.do?method=login"的操作且用的是POST方式,这里看html:form中action的值。
当开始执行loginAction.do时,首先进入ActionServlet中的doPost方法(假设ActionServlet的初始化方法已经在server启动时执行了,那么也就把相关的配置包括struts-config的内容加载了进来),然后调用process方法,在process方法中首先有selectModule的过程(其实就是找到这个请求的url对应的actionMapping配置,并放到request中),在process方法的最后会调用RequestProcess的process方法,而process最终会调用到DispatchAction的execute方法,这个就是struts请求的默认执行方法了。而我们的LoginAction类中并没有execute方法,那它肯定没法执行了。
其实这里就要回头再看一下我们的请求url中是不是有个method=login这个参数,在struts-config.xml中对loginAction的配置中有个 parameter="method" 的配置。那现在在回到我们的DispatchAction的execute方法中,在这里,这里就会获会获取这个值(如果配置了),取到这个parateter的值为method。而拿到这个method后又做了什么,其实就是把method作为参数通过request.getParameter(method)获取到一个值,这个值是什么,其实就是请求的url中的login,这样,要执行的方法就获取到了,而再通过反射的机制,去调用login这个方法,从而完成对login方法请求,并返回视图给用户。
源码分析之struts1自定义方法的使用与执行过程的更多相关文章
- spring aop 源码分析(二) 代理方法的执行过程分析
在上一篇aop源码分析时,我们已经分析了一个bean被代理的详细过程,参考:https://www.cnblogs.com/yangxiaohui227/p/13266014.html 本次主要是分析 ...
- 鸿蒙内核源码分析(信号生产篇) | 信号安装和发送过程是怎样的? | 百篇博客分析OpenHarmony源码 | v48.03
百篇博客系列篇.本篇为: v48.xx 鸿蒙内核源码分析(信号生产篇) | 年过半百,依然活力十足 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管 ...
- Netty源码分析 (六)----- 客户端连接接入accept过程
通读本文,你会了解到1.netty如何接受新的请求2.netty如何给新请求分配reactor线程3.netty如何给每个新连接增加ChannelHandler netty中的reactor线程 ne ...
- go源码分析(一) 通过调试看go程序初始化过程
参考资料:Go 1.5 源码剖析 (书签版).pdf 编写go语言test.go package main import ( "fmt" ) func main(){ fmt.Pr ...
- WebRTC 源码分析(五):安卓 P2P 连接过程和 DataChannel 使用
从本篇起,我们将迈入新的领域:网络传输.首先我们看看 P2P 连接的建立过程,以及 DataChannel 的使用,最终我们会利用 DataChannel 实现一个 P2P 的文字聊天功能. P2P ...
- Android4.0 Launcher 源码分析2——Launcher内容加载绑定详细过程
Launcher在应用启动的时候,需要加载AppWidget,shortcut等内容项,通过调用LauncherModel.startLoader(),开始加载的工作.launcherModel中加载 ...
- mybatis源码学习(二):SQL的执行过程
从上一篇文章中,我们了解到MapperMethod将SQL的执行交给了sqlsession处理.今天我们继续往下看处理的过程. SqlSession接口除了提供获取Configuration,Mapp ...
- Spark Scheduler模块源码分析之DAGScheduler
本文主要结合Spark-1.6.0的源码,对Spark中任务调度模块的执行过程进行分析.Spark Application在遇到Action操作时才会真正的提交任务并进行计算.这时Spark会根据Ac ...
- Spring Security 源码分析(四):Spring Social实现微信社交登录
社交登录又称作社会化登录(Social Login),是指网站的用户可以使用腾讯QQ.人人网.开心网.新浪微博.搜狐微博.腾讯微博.淘宝.豆瓣.MSN.Google等社会化媒体账号登录该网站. 前言 ...
随机推荐
- javascript中的原型理解总结
经过几天研究查找资料,对原型终于有点理解了,今天就做下总结,不对之处,希望各位能够提出. 1.每一个Javascript对象(null除外)都和另一个对象相关联,“另一个”对象就是我们今天所要总结的原 ...
- 近段时间学习html和CSS的一些细碎总结
1.边框圆角属性:border-radius,取值能够是 百分比 / 自己定义长度,不能够取负值.假设是圆,将高度和宽度设置相等,而且将border-radius设置为100% 2.IE6,IE7,I ...
- Task与Thread间的区别
通过查找一些文章,得知,Task与Thread不可比.Task是为了利用多CPU多核的机制而将一个大任务不断分解成小任务,这些任务具体由哪一个线程或当前线程执行由OS来决定.如果你想自己控制由哪一个T ...
- Android-版本与api对应关系图
Code name Version API level Lollipop 5.1 API level 22 Lollipop 5.0 API level 21 KitKat 4.4 - 4.4.4 A ...
- iPhone手机的屏幕尺寸、分辨率及适配
1.iPhone尺寸规格 设备 iPhone 宽 Width 高 Height 对角线 Diagonal 逻辑分辨率(point) Scale Factor 设备分辨率(pixel) PPI 3GS ...
- [Leetcode][016] 3Sum Closest (Java)
题目: https://leetcode.com/problems/3sum-closest/ [标签]Array; Two Pointers [个人分析] 这道题和它的姊妹题 3Sum 非常类似, ...
- mybatis常用语句
<trim>标签中,prefix 前缀,suffix后缀, suffixOverrides语句最后如果有指定符号,则去除此符号, prefixOverrides语句最前面如果有指定符号,则 ...
- POJ1961 KMP算法
POJ1961 问题重述: 输入一个长度为l的字符串S,求所有S的由字串重复排列而成的前缀,并输出前缀的长度以及该前缀的最大重复度. AC代码: //Memory: 5700K Time: 641MS ...
- pyqt5消息框QMessageBox
QMessageBox消息框有以下几种类型: QMessageBox.information 信息框 QMessageBox.question 问答框 QMessageBox.warning ...
- MVC4 路由参数带点 文件名后缀导致错误
错误描述 最近在研究office在线预览,用到mvc4 apicontroller 需要传参是文件名,如test.docx导致错误"指定的目录或文件在 Web 服务器上不存在", ...