Java 框架之 Struts2

说明

Struts2 是基于MVC的WEB框架。Struts是一个基于Sun J2EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的。由于Struts能充分满足应用开发的需求,简单易用,敏捷迅速,在过去的一年中颇受关注。Struts把Servlet、JSP、自定义标签和信息资源(message resources)整合到一个统一的框架中,开发人员利用其进行开发时不用再自己编码实现全套MVC模式,极大的节省了时间,所以说Struts是一个非常不错的应用框架。

官方地址:http://struts.apache.org

创建Struts项目

在eclipse中创建Web动态项目struts

在eclipse中新建项目struts,使用dynamic web project的方式。

导入相关jar包

下载 lib.rar,解压后复制到WEB-INF/lib里
file

新建web.xml

在WEB-INF目录下新建web.xml
其中配置了一个 Filter, 所有的请求都被过滤给了这个 Filter
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

<web-app>
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>
            org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
        </filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>REQUEST</dispatcher>       
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>

配置struts.xml

在src目录下创建一个struts.xml文件
这是最简单的struts.xml配置
其效果是当访问index路径的时候,服务端跳转到index.jsp

<?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="index">
    <result>index.jsp</result>
  </action>   

</package>

</struts>

创建index.jsp

web目录下创建index.jsp,
其内容很简单 就是一句

Hello Struts2 World

file

部署在tomcat中,重启测试

部署在Tomcat中,重启tomcat,然后访问地址,观察效果

http://127.0.0.1:8080/struts/index

相当于实现了servlet的服务端跳转到index.jsp的功能

原理

  1. 所有的访问都会被web.xml中配置的Struts 的 Filter所拦截
  2. 拦截之后,就进入struts的工作流程
  3. 访问的地址是/index,根据struts按照 struts.xml中的配置,服务端跳转到index.jsp
  4. 显示index.jsp的内容

file

Struts显示数据

Product.java 用于存放数据

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

package com.how2java.bean;

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;
    }
}

ProductAction用于控制

package com.how2java.action;

import com.how2java.bean.Product;

public class ProductAction {
    private Product product;

    public String show() {
        product = new Product();
        product.setName("iphone7");
        return "show";
    }

    public Product getProduct() {
        return product;
    }

    public void setProduct(Product product) {
        this.product = product;
    }
}

在struts.xml中配置跳转

该配置表示 访问路径/showProduct会调用 ProductAction 类的 show 方法
服务端跳转到show.jsp

<?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.how2java.action.ProductAction" method="show">
    <result name="show">show.jsp</result>
  </action>   

</package>

</struts>

show.jsp

web目录下创建show.jsp文件
通过EL表达式,取出product的name
注: ${product}会访问对应的Action的 getProduct() 方法

注: 严格地说,是Struts通过getProudct()方法返回product对象,然后再把product对象通过request.setAttribute("product", product) 放在"product" 这个key上,这样就方便EL表达式去取出来了

<%@page isELIgnored="false"%>
${product.name}

测试

重启tomcat 访问

http://127.0.0.1:8080/struts/showProduct

小结

  1. 访问路径 /showProduct
  2. 所有访问都被struts的filter所拦截,并进入struts的工作流程
  3. 根据配置文件struts.xml, 会执行ProductAction的show方法
  4. 在show方法中,将实例属性product指向一个新的对象,并设置名称为iphone7
  5. 服务端跳转到show.jsp
  6. 在show.jsp中,访问ProductAction.getProduct() 获取实例属性product,并显示其名称iphone7

为者常成,行者常至