自己做了一个简单的测试Struts2 的MVC流程,并且连接了数据库。需要的包为四个包  commons-logging,ognl,struts2-core,xwork这四个包
当需要连接MySQL数据库的时候需要加包MySQL-connector-java
我们的文件结构为
我们的包加在WEB-INF的lib目录下。web.xml配置在WEB-INF中,在src文件夹里我们有struts.xml配置文件和action实现类
我们的LoginAciton为
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.DateFormat;
import java.util.Date;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport 
{
//下面是Action内用于封装用户请求参数的两个属性
private String user;
private String password;
private String name;
//user属性对应的getter方法
public String getuser()
{
return user;
}
//user属性对应的setter方法
public void setuser(String user)
{
this.user = user;
}
//password属性对应的getter方法
public String getPassword()
{
return password;
}
//password属性对应的setter方法
public void setPassword(String password)
{
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//处理用户请求的execute方法
public String execute() throws Exception
{
String ret = ERROR;
Connection conn = null;
try {
String URL = "jdbc:mysql://localhost/struts_tutorial";
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(URL, "root", "yuanchao");
String sql = "SELECT name FROM login WHERE";
sql+=" user = ? AND password = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, user);
ps.setString(2, password);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
name = rs.getString(1);
ret = SUCCESS;
}
} catch (Exception e) {
ret = ERROR;
} finally {
if (conn != null) {
try {
conn.close();
} catch (Exception e) {
}
}
}
return ret;
}
}
我们在struts.xml中配置相应动作的action
<struts>
<!-- Struts 2的Action必须放在指定的包空间下定义 -->
<package name="strutsqs" extends="struts-default">
<!-- 定义login的Action,该Action的实现类为lee.Action类 -->
<action name="Login" class="LoginAction">
<!-- 定义处理结果和资源之间映射关系。 -->
<result name="error">/error.jsp</result>
<result name="success">/welcome.jsp</result>        
</action>
</package>
</struts>

我们在web.xml中配置filter
<filter>
<!-- 定义核心Filter的名称 -->
<filter-name>struts2</filter-name>
<!--定义核心Filter的实现类 -->
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<!--核心Filter的名称 -->
<filter-name>struts2</filter-name>
<!--使用该核心Filter来接受所有的Web请求 -->
<url-pattern>/*</url-pattern>
</filter-mapping>

在上述的当用户请求参数的同MySQL数据库中的参数相对应返回成功,否则失败
当然我们可以采用

String user = (String)ActionContext.getContext().getSession().get("user");来获得用户名的属性

疑问一:getUsername()就可以获得我们表单里的用户名 
堆栈跟踪执行过程   
LoginAction.execute() 
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39    
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25    
Method.invoke(Object, Object...) line: 597    
DefaultActionInvocation.invokeAction(Object, ActionConfig) line: 404    
DefaultActionInvocation.invokeActionOnly() line: 267    
DefaultActionInvocation.invoke() line: 229    
DefaultWorkflowInterceptor.doIntercept(ActionInvocation) line: 221    
DefaultWorkflowInterceptor(MethodFilterInterceptor).intercept(ActionInvocation) line: 86    
DefaultActionInvocation$2.doProfiling() line: 224    
DefaultActionInvocation$2.doProfiling() line: 223    
UtilTimerStack.profile(String, ProfilingBlock<T>) line: 455    
DefaultActionInvocation.invoke() line: 221    
AnnotationValidationInterceptor(ValidationInterceptor).doIntercept(ActionInvocation) line: 150    
AnnotationValidationInterceptor.doIntercept(ActionInvocation) line: 48    
AnnotationValidationInterceptor(MethodFilterInterceptor).intercept(ActionInvocation) line: 86    
DefaultActionInvocation$2.doProfiling() line: 224    
DefaultActionInvocation$2.doProfiling() line: 223    
UtilTimerStack.profile(String, ProfilingBlock<T>) line: 455    
DefaultActionInvocation.invoke() line: 221    
StrutsConversionErrorInterceptor(ConversionErrorInterceptor).intercept(ActionInvocation) line: 123    
DefaultActionInvocation$2.doProfiling() line: 224    
DefaultActionInvocation$2.doProfiling() line: 223    
UtilTimerStack.profile(String, ProfilingBlock<T>) line: 455    
DefaultActionInvocation.invoke() line: 221    
ParametersInterceptor.doIntercept(ActionInvocation) line: 167    
ParametersInterceptor(MethodFilterInterceptor).intercept(ActionInvocation) line: 86    
DefaultActionInvocation$2.doProfiling() line: 224    
DefaultActionInvocation$2.doProfiling() line: 223    
UtilTimerStack.profile(String, ProfilingBlock<T>) line: 455    
DefaultActionInvocation.invoke() line: 221    
StaticParametersInterceptor.intercept(ActionInvocation) line: 105    
DefaultActionInvocation$2.doProfiling() line: 224    
DefaultActionInvocation$2.doProfiling() line: 223    
UtilTimerStack.profile(String, ProfilingBlock<T>) line: 455    
DefaultActionInvocation.invoke() line: 221    
CheckboxInterceptor.intercept(ActionInvocation) line: 83    
DefaultActionInvocation$2.doProfiling() line: 224    
DefaultActionInvocation$2.doProfiling() line: 223    
UtilTimerStack.profile(String, ProfilingBlock<T>) line: 455    
DefaultActionInvocation.invoke() line: 221    
FileUploadInterceptor.intercept(ActionInvocation) line: 207    
DefaultActionInvocation$2.doProfiling() line: 224    
DefaultActionInvocation$2.doProfiling() line: 223    
UtilTimerStack.profile(String, ProfilingBlock<T>) line: 455    
DefaultActionInvocation.invoke() line: 221    
ModelDrivenInterceptor.intercept(ActionInvocation) line: 74    
DefaultActionInvocation$2.doProfiling() line: 224    
DefaultActionInvocation$2.doProfiling() line: 223    
UtilTimerStack.profile(String, ProfilingBlock<T>) line: 455    
DefaultActionInvocation.invoke() line: 221    
ScopedModelDrivenInterceptor.intercept(ActionInvocation) line: 127    
DefaultActionInvocation$2.doProfiling() line: 224    
DefaultActionInvocation$2.doProfiling() line: 223    
UtilTimerStack.profile(String, ProfilingBlock<T>) line: 455    
DefaultActionInvocation.invoke() line: 221    
ProfilingActivationInterceptor.intercept(ActionInvocation) line: 107    
DefaultActionInvocation$2.doProfiling() line: 224    
DefaultActionInvocation$2.doProfiling() line: 223    
UtilTimerStack.profile(String, ProfilingBlock<T>) line: 455    
DefaultActionInvocation.invoke() line: 221    
ChainingInterceptor.intercept(ActionInvocation) line: 115    
DefaultActionInvocation$2.doProfiling() line: 224    
DefaultActionInvocation$2.doProfiling() line: 223    
UtilTimerStack.profile(String, ProfilingBlock<T>) line: 455    
DefaultActionInvocation.invoke() line: 221    
I18nInterceptor.intercept(ActionInvocation) line: 143    
DefaultActionInvocation$2.doProfiling() line: 224    
DefaultActionInvocation$2.doProfiling() line: 223    
UtilTimerStack.profile(String, ProfilingBlock<T>) line: 455    
DefaultActionInvocation.invoke() line: 221    
PrepareInterceptor.doIntercept(ActionInvocation) line: 121    
PrepareInterceptor(MethodFilterInterceptor).intercept(ActionInvocation) line: 86    
DefaultActionInvocation$2.doProfiling() line: 224    
DefaultActionInvocation$2.doProfiling() line: 223    
UtilTimerStack.profile(String, ProfilingBlock<T>) line: 455    
DefaultActionInvocation.invoke() line: 221    
ServletConfigInterceptor.intercept(ActionInvocation) line: 170    
DefaultActionInvocation$2.doProfiling() line: 224    
DefaultActionInvocation$2.doProfiling() line: 223    
UtilTimerStack.profile(String, ProfilingBlock<T>) line: 455    
DefaultActionInvocation.invoke() line: 221    
AliasInterceptor.intercept(ActionInvocation) line: 123    
DefaultActionInvocation$2.doProfiling() line: 224    
DefaultActionInvocation$2.doProfiling() line: 223    
UtilTimerStack.profile(String, ProfilingBlock<T>) line: 455    
DefaultActionInvocation.invoke() line: 221    
ExceptionMappingInterceptor.intercept(ActionInvocation) line: 176    
DefaultActionInvocation$2.doProfiling() line: 224    
DefaultActionInvocation$2.doProfiling() line: 223    
UtilTimerStack.profile(String, ProfilingBlock<T>) line: 455    
DefaultActionInvocation.invoke() line: 221    
StrutsActionProxy.execute() line: 50    
Dispatcher.serviceAction(HttpServletRequest, HttpServletResponse, ServletContext, ActionMapping) line: 504    
FilterDispatcher.doFilter(ServletRequest, ServletResponse, FilterChain) line: 423    
ApplicationFilterChain.internalDoFilter(ServletRequest, ServletResponse) line: 244    
ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 210    
StandardWrapperValve.invoke(Request, Response) line: 272    
StandardContextValve.invoke(Request, Response) line: 123    
NonLoginAuthenticator(AuthenticatorBase).invoke(Request, Response) line: 506    
StandardHostValve.invoke(Request, Response) line: 169    
ErrorReportValve.invoke(Request, Response) line: 105    
AccessLogValve.invoke(Request, Response) line: 957    
StandardEngineValve.invoke(Request, Response) line: 118    
CoyoteAdapter.service(Request, Response) line: 438    
返回到登录成功跳转页面 看看上面的执行过程的堆栈 醉了 好在有许多函数是重复调用的 我先挑出来
关于下几篇文章
1 分析上述堆栈
2 分析ActionContext
3 分析ActionContext对应的ThreadLocal
4 查找上述的值传递过程

转载于:https://www.cnblogs.com/winAlaugh/p/5435062.html

struts 的 MVC ,自己堆栈跟踪(可以跟着做一遍)相关推荐

  1. 服务器日志文件中包含堆栈跟踪,日志框架 Logback 官方手册(第三章:Configuration)...

    以下内容翻译整理自logback官方手册,地址:logback官方手册 logback 配置 将日志请求插入应用程序代码需要相当多的计划和工作.观察表明,大约有4%的代码用于日志记录.因此,即使是一个 ...

  2. 在不丢失堆栈跟踪的情况下重新抛出Java中的异常

    在C#中,我可以使用throw; 保留堆栈跟踪时重新抛出异常的语句: try {... } catch (Exception e) {if (e is FooException)throw; } Ja ...

  3. gdb调试之堆栈跟踪

    在使用gdb调试时,经常要用到查看堆栈信息,特别是在内核调试时,这 显得尤其重要.通过gdb的堆栈跟踪,可以看到所有已调用的函数列表,以及 每个函数在栈中的信息. ------------------ ...

  4. oracle获取堆栈,如何从RAISED异常中获取oracle PL / SQL中原始异常的堆栈跟踪?

    我有一个问题,当我捕获异常时,原始堆栈跟踪丢失,然后提高它. >在proc_a中抛出异常 >抓住例外. >执行回滚. >提出异常. >捕获异常(父块) >打印堆栈跟 ...

  5. .NET/.NET Core中更清晰的堆栈跟踪

    在基于异常的语言中,堆栈跟踪是用于诊断问题最重要的工具之一.在某些情况下,开发人员能得到的仅为一条简短的错误信息以及堆栈跟踪,尤其是当个人可识别信息(PII)约束限制了日志记录的内容时. 随着任务并行 ...

  6. java异常——分析堆栈跟踪元素+使用异常机制的技巧

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java异常--分析堆栈跟踪元素+使用异常机制的技巧 的相关知识: [1]分析堆栈跟踪元素相关 ...

  7. 堆栈跟踪 堆栈跟踪_寻找缺少的堆栈跟踪

    堆栈跟踪 堆栈跟踪 我们最近在博客中发表的一篇评论带回了有关特定体验的一些回忆. 我希望我没有经历过的那种经历. 在创建Plumbr之前很长一段时间,我正在调试一个应用程序,该应用程序每次在蓝月亮时都 ...

  8. Web应用程序体系结构– Spring MVC – AngularJs堆栈

    Spring MVC和AngularJs共同为构建表单密集型Web应用程序提供了一个真正高效且吸引人的前端开发堆栈.在这篇博客文章中,我们将看到如何使用这些技术构建表单密集型Web应用程序,并将这种方 ...

  9. 如何分析线程转储–线程堆栈跟踪

    本文是" 线程转储"分析系列的第5部分. 到目前为止,您已经了解了线程的基本原理以及它们与Java EE容器和JVM的交互. 您还学习了HotSpot和IBM Java VM的不同 ...

最新文章

  1. MySQL修改存储过程
  2. Xilinx FPGA,“加速”视频质量提升
  3. sublime默认html,Sublime Text默认HTML评论
  4. 关于 m1 xcode12 编译报错 this target. for architecture arm64等问题解决方案
  5. kvm虚拟机设置万兆网卡_kvm已经设置桥接网卡的虚拟机无法连接宿主机?
  6. 机器学习 - 贝叶斯网络
  7. 湖北 政府项目 软件 测试,湖北电子政务应用系统技术验收测试规范.doc
  8. unity3d 嵌入 移动MM SDK 闪退的问题
  9. linux下xz文件如何解压,tar.xz文件如何解压
  10. 如何提升你的面试机会?
  11. linux那些事儿之我是i2c -- Gsenser(三)
  12. 保研夏令营数学复习(高数 概率 线代)
  13. Windows7双屏扩展及双屏桌面背景独立显示
  14. QCC512x QCC302x GAIA OTA DFU 升级(earbud)
  15. 程序员大阳--所有教程、项目、源码导航
  16. 双目三维重建_系列篇|结构光三维重建基本原理
  17. vue3项目将图片正时针、逆时针旋转
  18. ArcGIS模拟风场(流场)
  19. 如何在AutoCAD中实现鼠标双击事件
  20. LeetCode题解(0417):太平洋大西洋水流问题(Python)

热门文章

  1. 比较两个日期大小和获取当前月最大天数的存储过程
  2. 20个非常好用的正则表达式
  3. websocket学习笔记
  4. 数据结构学习之路-第一章:绪论
  5. Java Object.hashCode()方法
  6. 【设计模式:单例模式】使用单例模式加载properties文件
  7. 【搜索引擎基础知识3】搜索引擎相关开源项目及网站
  8. java中的char可以存储汉字吗?
  9. Elasticsearch SQL介绍及实例
  10. 最新RemObjects,您值得拥有