zoukankan      html  css  js  c++  java
  • struts 的 MVC ,自己堆栈跟踪(可以跟着做一遍)

    自己做了一个简单的测试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 查找上述的值传递过程
  • 相关阅读:
    Java 线程池学习
    Java线程:新特征-线程池
    创建Java线程池
    JAVA-线程安全性
    java线程安全总结
    栈和队列
    历年题目
    蓝桥杯算法训练
    hdu2083 暴力水
    poj 2299
  • 原文地址:https://www.cnblogs.com/winAlaugh/p/5435062.html
Copyright © 2011-2022 走看看