• 十三、MVC的WEB框架(Structs2)


    一、Structs2的应用

    Structs2是基于MVC的WEB框架。一般基于框架的程序要运行成功,对于JAR包的版本,配置文件的正确性有着苛刻的要求,一个地方错了,都会导致框架程序运行出错。

    1、首先在Eclipse创建一个动态web项目structs,使用dynamic web project的方式。

    2、新建web.xml

    在WEB-INF目录下新建web.xml,然后配置一个过滤器Filter,所有的请求都让这个过滤器进行过滤

    <web-app>
        <filter>
            <filter-name>structs2</filter-name>
            <filter-class>org.apache.structs2.ng.filter.StructsPrepareAndExecuteFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>structs2</filter-name>
            <dispatcher>FORWARD</dispatcher>
            <dispatcher>REQUEST</dispatcher>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    </web-app>

    3、配置structs.xml

    在src目录下创建一个structs.xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
    
    <struts>
      <package name="basicstruts" extends="struts-default">
        <!--当访问index路径的时候,服务端跳转到index.jsp-->
      <action name="index">
        <result>index.jsp</result>
      </action>    
    </package>
    </struts>

    4、创建index.jsp

    在webContent目录下创建index.jsp,输入HelloWorld

    5、Structs2的运行原理

      5.1、所有的访问都会被web.xml中配置的structs的Filter进行过滤工作

      5.2、 进行过滤工作,进入structs的工作流程

      5.3、访问的地址是/index,根据structs按照structs.xml中配置,服务端跳转到index.jsp

      5.4、显示index.jsp的内容

    二、显示数据到JSP

    把Model的数据显示在视图JSP上

    1、建立一个实体类Product.java

    Model层使用一个Product用于存放数据

    package com.demo.model;
    
    public class Product {
    
        int id;
        String name;
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }
    View Code

    2、建立一个控制器ProductAction.java

    Action层使用

    package com.demo.action;
    
    import com.demo.model.Product;
    
    public class ProductAction{
        private Product product;
        
        public String show(){
            product=new Product();
            product.setName("apple");
            return "show";
        }
        
        public Product getProduct(){
            return product;
        }
        
        public void setProduct(Product product){
            this.product=product;
        }
    }
    View Code

    3、在structs.xml中配置跳转

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
     
    <struts>
      <package name="basicstruts" extends="struts-default">
      <!--当访问路径为/showProduct时,会调用ProductAction的方法show,服务端跳转到show.jsp-->
          <action name="showProduct" class="com.demo.action.ProductAction" method="show">
            <result name="show">show.jsp</result>
          </action>     
        </package> 
    </struts>

    4、show.jsp的创建

    在webContent目录下创建show.jsp文件,通过EL表达式,取出product的name

    ${product}会访问对应的Action的getProduct()方法

    5、过程原理

      5.1、当访问路径是/showProduct时

      5.2、所有访问都被structs的Filter拦截,进入到structs的工作流程

      5.3、根据配置文件structs.xml,会执行ProductAction的show方法

      5.4、在show方法中,将实例属性product指向一个新的对象,然后设置名称

      5.5、服务端跳转show.jsp

      5.6、在show.jsp中,访问ProductAction.getProduct()获取实例属性product,并显示名称。

    三、提交数据到Action

    比如jsp提交product的name到action,然后action有跳转回来showProduct.jsp把提交的name显示出来。

    1、form表单提交数据

    <from action="addProduct">
        <input type="text" name="product.name"/>
        <br/>
        <input type="submit" value="submit"/>
    </form>

    2、ProductAction增加addProduct()方在addProduct.jsp中提交数据的field是product.name,会自动调用对应的Action的setProduct(Product product)方法进行数据的注入

    所以ProductAction必须提供setProduct(Product product)方法。

    package com.demo.action;
    
    import com.demo.model.Product;
    
    public class ProductAction {
        private Product product;
        
        public String show(){
            product = new Product();
            product.setName("iphone7");
            return "show";
        }
        public String addProduct(){
            System.out.println("product.name:"+product.getName());
            return "show";
        }
        
        public Product getProduct() {
            return product;
        }
        public void setProduct(Product product) {
            this.product = product;
        }
    }
    View Code

    3、配置stucts.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
    
    <struts>
      <package name="basicstruts" extends="struts-default">
      <action name="showProduct" class="com.demo.action.ProductAction" method="show">
        <result name="show">show.jsp</result>
      </action>    
      <action name="addProduct" class="com.demo.action.ProductAction" method="add">
        <result name="show">show.jsp</result>
      </action>    
    </package>
    </struts>

    4、中文问题

    structs的中文问题,3部分构成:

      4.1、jsp提交数据的时候,必须是UTF-8编码

      4.2、structs拿到数据后进行UTF-8编码

      4.3、服务端跳转到jsp进行显示的时候,也要指定浏览器使用UTF-8显示。

    UTF-8可以换成GBK,GB2312,但是必须要统一的编码,不能混用。

    四、使用日志

    在src目录下增加log4j.xml,打开日志功能。

    有时候由于失误,导致action名字配置错误等,strcuts启动失败,而且tomcat给出的错误信息很不利于调试,无法知道哪里写错,可以使用log4j功能

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd">
     
    <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
         
        <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
           <layout class="org.apache.log4j.PatternLayout"> 
              <param name="ConversionPattern" value="%d %-5p %c.%M:%L - %m%n"/> 
           </layout> 
        </appender>
      
        <!-- specify the logging level for loggers from other libraries -->
        <logger name="com.opensymphony">
            <level value="ERROR" />
        </logger>
     
        <logger name="org.apache">
             <level value="ERROR" />
        </logger>
        <logger name="org.hibernate">
             <level value="ERROR" />
        </logger>
       
       <!-- for all other loggers log only debug and above log messages -->
         <root>
            <priority value="ERROR"/> 
            <appender-ref ref="STDOUT" /> 
         </root> 
         
    </log4j:configuration> 

    也可以使用log4j.properties文件(key-value形式的文件)的方式。

    #设置日志输出的登记为debug,低于debug就不会输出了
    #设置日志输出到两种地方,分别叫做stdout和R
    log4j.rootLogger=debug, stdout, R
    #日志输出第一个地方stdout,输出到控制台
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    #输出格式是%5p [%t] (%F:%L) - %m%n
    log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
    
    #日志输出第二个地方R,以滚动的方式输出到文件,文件名是example.log,文件最大为100k,最多滚动5个文件
    log4j.appender.R=org.apache.log4j.RollingFileAppender
    log4j.appender.R.File=example.log
    log4j.appender.R.MaxFileSize=100KB
    log4j.appender.R.MaxBackupIndex=5
    
    #输出格式是%p %t %c -%m%n
    log4j.appender.R.layout=org.apache.log4j.PatternLayout
    log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
    
    
    #log4j日志输出格式解释:
    #%p:表示输出优先级,以debug,info,warn,error,fatal。如果调用debug输出,则为debug
    #%t:输出产生该日志时间的线程名
    #%c:输出日志信息所属的类的全名
    #%m:输出代码中指定的信息,如log(message)中的message
    #%n:输出一个回车换行符号
    #%d:输出日志时间点的日期或时间。也可以指定时间格式%d{yyy-MM-dd HH:mm:ss}
    #%F:输出日志信息所属的类的类名
    #%L:输出日志事件发生位置,也即是输出日志信息的语句所处于它在所在类的第几行。
  • 相关阅读:
    Java 基础知识(五)
    Java 基础知识(四)
    Java 基础知识(三)
    Java 基础知识(二)
    python 默认参数潜在的问题
    python中统计计数的几种方法和Counter的介绍
    简单的总结一下到底什么是python
    python中的__solots__方法
    python中生成器和迭代器以及可迭代对象的区别
    游览器访问一个网址的全过程
  • 原文地址:https://www.cnblogs.com/drq1/p/8568635.html
Copyright © 2020-2023  润新知