• Struts2学习(一)


    简介

    1、Apache Struts的前世今生

    • Apache Struts 1 实在2009前应用广泛的web开发框架(最后一个版本是1.3.10)
    • Apache Struts 2是在Apache 在webwork基础上重新开发出来的新一代web开发框架,在目前的Apache Struts 2框架中依然有 webwork的印记:xwork2包

    2、Apache Struts 2的执行流程:

    • 客户端发出请求到web服务器
    • 请求经过一系列filter,最终到达Struts2核心控制器
    • 核心控制器查看ActionMapper,判断该请求是请求action还是其他资源(如:jsp页面文件)
    • 如果请求action,则核心控制器创建一个ActionProxy代理,并把请求交给代理进行处理。ActionProxy是通过ConfigurationManager读取structs.xml配置文件来创建的,所以包含了配置文件中的一切信息
    • ActionProxy根据请求,创建相应的action调用实例ActionInvocation,ActionInvocation实例不仅仅只有action对象,还包括在配置文件中配置好的拦截器、action实例、结果集等
    • 依次执行ActionInvocation实例中的拦截器、action实例,返回result,根据result决定响应页面,倒序继续执行拦截器剩下的部分,最终通过response进行响应,返回客户端

    3、由上面可知Struts2开发需要用到:

    • 处理请求的Action类以及拦截器类
    • 配置Action、拦截器、结果响应行为等的struts.xml
    • 在web.xml中配置核心控制器

    搭建环境

    1、创建 动态的 WEB 工程
    2、在 WEB-INF/lib 中添加,下载链接:https://files.cnblogs.com/files/AmyZheng/struts-2.5.10.1-min-lib.zip
                commons-fileupload-1.3.2.jar
                commons-io-2.4.jar
                commons-lang3-3.4.jar
                freemarker-2.3.23.jar
                javassist-3.20.0-GA.jar
                log4j-api-2.7.jar
                ognl-3.1.12.jar
                struts2-core-2.5.10.1.jar
    3、在 web.xml 中部署 Struts 对应 过滤器

    <?xml version="1.0" encoding="UTF-8"?>
    
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                   xmlns="http://java.sun.com/xml/ns/javaee" 
                   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
                                                    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
                   id="WebApp_ID" 
                   version="3.0">
       <!-- 配置 Struts 过滤器 -->
        <filter>
            <filter-name>ApacheStruts2</filter-name>
            <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
        </filter>
        
        <filter-mapping>
            <filter-name>ApacheStruts2</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    
    </web-app>

    注意:
    Struts 2.5 开始使用org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
    在Struts 2.5 之前使用org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

    4、验证 Struts 已经起作用

    <%@ page language = "java" pageEncoding = "UTF-8" %>
    <%@ page contentType = "text/html; charset= UTF-8"%>
    <%@ taglib prefix = "s" uri = "/struts-tags"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Apache Struts</title> </head> <body> <h1>Apache Struts</h1> <s:debug /> </body> </html>

    第一个实例
    1、开发一个Action

    • 可以实现 com.opensymphony.xwork2.Action 接口,实现execute 方法
    • 可以继承  com.opensymphony.xwork2.ActionSupport类,重写execute 方法
    • 可以单独写一个类,其中有一个execute方法即可:
    package ecut.first.action;
    
    public class RegistAction {
            
        private String username ;
        private String password ;
        private String confirm ;
        private char gender ;
        
        public String execute() throws Exception {
            
            System.out.println( "username : " + username );
            System.out.println( "password : " + password );
            System.out.println( "confirm : " + confirm );
            System.out.println( "gender : " + gender );    
            return "成功" ;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public String getConfirm() {
            return confirm;
        }
    
        public void setConfirm(String confirm) {
            this.confirm = confirm;
        }
    
        public char getGender() {
            return gender;
        }
    
        public void setGender(char gender) {
            this.gender = gender;
        }
        
    }

    2、在src目录下新建 struts.xml(必须在src目录底下)

    参照struts2-core-2.5.10.1.jar中struts-2.5.dtd中的说明编写struts.xml

     让Eclipse支持struts.xml的智能提示,将dtd文件复制到容易查找的目录下,在Eclipse的导航选择Widow下的preferences,选择如下目录

    点击Add,显示如下页面,Key Type选择URI

     Location 选择dtd文件所在路径,Key填入http://struts.apache.org/dtds/struts-2.5.dtd

     

    <?xml version="1.0" encoding="UTF-8"?>
    
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">
    
    <struts>
        <!-- first -->
        <!-- @WebServlet( "/customer/regist" ) -->
        <!-- 用 name 属性 指定 package 的名称 , 用 namespace 指定命名空间,必须 用 extends 指定继承哪个包 -->
        <package name="customer" namespace="/customer" extends="struts-default">
    
            <action name="regist" class="ecut.first.action.RegistAction" method="execute">
                <result name="成功">/first/success.jsp</result>
                <result name="失败">/first/fail.jsp</result>
            </action>
    
        </package>
    
    </struts>

    struts 标签是配置文件的根元素
    package 标签用来声明一个“包”(不是Java语言中的包)
        name 属性用来指定报名通常建议跟namespace保持一致
        namespace属性用来指定命名空间,与URL中的路径保持一致
        extends属性用来指定继承那个包(只能继承一个包)
    action 标记定义个action
        name属性与URL中的对应
        class属性指定该action 对应的Action类(ActionClassName)
    result 标记是action内部的一个子标记,用来声明返回的结果
        name属性指定将来在Action类中的execute方法返回的结果的名称
            (name属性的默认值是"success")
        type属性用来指定打开结果对应页面或资源的方式,默认是dispatch
            (相当于Servlet 中 RequestDispatch#forward操作)

     3、提供页面,访问已经配置好的Action

    <%@ page language = "java" pageEncoding = "UTF-8" %>
    <%@ page contentType = "text/html; charset= UTF-8"%> <%@ taglib prefix = "s" uri = "/struts-tags"%>
    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Apache Struts</title> </head> <body> <h1>Apache Struts</h1> <a href="http://struts.apache.org">Apache Struts</a> <br> <a href="http://commons.apache.org">Apache Commons</a> <br> <form action="${ pageContext.request.contextPath }/customer/regist" method="post" > <input type="text" name="username" placeholder="用户名"> <input type="password" name="password" placeholder="密码"> <input type="password" name="confirm" placeholder="确认密码"> 性别: <input type="radio" name="gender" value="女" ><input type="radio" name="gender" value="男" ><input type="submit" > </form> <hr> <s:debug /> </body> </html>
    <%@ page language = "java" pageEncoding = "UTF-8" %>
    <%@ page contentType = "text/html; charset= UTF-8"%>
    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>注册失败</title> </head> <body> <h1>fail</h1> </body> </html>
    <%@ page language = "java" pageEncoding = "UTF-8" %>
    <%@ page contentType = "text/html; charset= UTF-8"%>
    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>注册成功</title> </head> <body> <h1>success</h1> </body> </html>

    4、启动Tomcat,输入http://localhost:8080/Struts/first/index.jsp,跳转success页面

     

    添加对log4j的支持

    1、 解决启动服务日志中两个问题

    解决:
    ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console...
    在WEB-INFO/lib目录下贴加:log4j-core-2.7.jar
    解决:
    ERROR StatusLoggVer No log4j2 configuration file found. Using default configuration: logging only errors to the console.

    src 目录创建 log4j2.xml 文件

    2、 log4j2 日志组件的使用

    • log4j2 是 Apache 提供的 日志组件 ( Struts 2 中默认采用了 该组件 )
    • 提供 log4j2 所必须的 jar 文件:log4j-api-2.7.jar, log4j-core-2.7.jar
    • 提供 log4j2 配置文件,在 WEB 工程的 src 目录创建 log4j2.xml 文件,其中内容如下:
      <?xml version="1.0" encoding="UTF-8"?>
                      
                      <configuration status="OFF">
                          <appenders>
                              <console name="Console" target="SYSTEM_OUT">
                                  <PatternLayout  pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
                              </console>
                          </appenders>
                          <loggers>
                              <!-- 指定日志的级别 -->
                              <root level="trace" >
                                  <appender-ref ref="Console" />
                              </root>
                          </loggers>
                      </configuration>

      日志的级别可以指定为 all 、 trace 、debug 、info  、warn 、log 、error 、fatal 、off 中的任意一个
      按照优先级从低到高依次排列为: all < trace < debug < info  < warn < log < error < fatal < off
      优先级越低,输出的内容越多;优先级越高,输出的内容越少。

    • 在相应的类中使用 log4j2 输出日志:
      package ecut.first.logger.test;
      
      import org.apache.logging.log4j.Level;
      import org.apache.logging.log4j.LogManager;
      import org.apache.logging.log4j.Logger;
      
      public class Log4j2Test {
          
          private static final Logger logger = LogManager.getLogger();
      
          public static void main(String[] args) {
      
              logger.log( Level.ALL ,  "all message" );// Level.ALL
              
              logger.trace( "trace message" ); // 对应 logger.log(  Level.TRACE , message );
              logger.debug( "debug message" ); // 对应 logger.log( Level.DEBUG, message );
              logger.info( "info message" ); // 对应  logger.log( Level.INFO, message );
              logger.warn( "warn message" ); // 对应  logger.log( Level.WARN, message );
              logger.error( "error message" ); // 对应  logger.log( Level.ERROR, message );
              logger.fatal( "fatal message" ); // 对应  logger.log( Level.FATAL , message );
              logger.log( Level.FATAL , "FATAL" );
              
              logger.log( Level.OFF , "off message" );// Level.OFF
              
          }
      
      }

      <PatternLayout  pattern="%d{yyyy-MM-dd HH:mm:ss.SSS}  [%t] %p %l - %m %n" />
              模式转换字符:
                      转换字符    表示的意思
                          c            用于输出的记录事件的类别。例如,对于类别名称"a.b.c" 模式  %c{2} 会输出 "b.c"
                          C            用于输出呼叫者发出日志请求的完全限定类名。例如,对于类名 "org.apache.xyz.SomeClass", 模式 %C{1} 会输出 "SomeClass".
                          d            用于输出的记录事件的日期。例如, %d{HH:mm:ss,SSS} 或 %d{yyyy-MM-dd HH:mm:ss.SSS}
                          F            用于输出被发出日志记录请求,其中的文件名
                          l            用于将产生的日志事件调用者输出位置信息
                          L            用于输出从被发出日志记录请求的行号
                          m            用于输出使用日志事件相关联的应用程序提供的消息
                          M            用于输出发出日志请求所在的方法名称
                          n            输出平台相关的行分隔符或文字
                          p            用于输出的记录事件的优先级
                          r            用于输出毫秒从布局的结构经过直到创建日志记录事件的数目
                          t            用于输出生成的日志记录事件的线程的名称
                          x            用于与产生该日志事件的线程相关联输出的NDC(嵌套诊断上下文)
                          X            在X转换字符后面是键为的MDC。例如  X{clientIP} 将打印存储在MDC对键clientIP的信息
                          %            文字百分号 %%将打印%标志

    参考博客链接:

    http://www.cnblogs.com/ygj0930/p/6807539.html

    转载请于明显处标明出处

    https://www.cnblogs.com/AmyZheng/p/9193513.html

  • 相关阅读:
    nagle算法和TCP_NODELAY
    Makefile 中的.PHONY
    Linux--信号阻塞与屏蔽
    Linux的SIGUSR1和SIGUSR2信号
    Github和Git上fork指南
    Python 中函数的 收集参数 机制
    【奥斯卡理财星体系 第二章】丨你该如何做好理财规划
    【奥斯卡理财星体系 第一章】丨你该如何找到理财正确的方向
    【奥斯卡理财星体系 序篇】为什么你需要学习这个理财体系?
    零基础学基金投资系列-08-基金排行榜
  • 原文地址:https://www.cnblogs.com/AmyZheng/p/9193513.html
Copyright © 2020-2023  润新知