Struts学习(一)

使用Filter作为控制器的MVC

MVC设计模式概览

实现 MVC(Model、View、Controller) 模式的应用程序由 3 大部分构成:

模型:封装应用程序的数据和业务逻辑

视图:实现应用程序的信息显示功能

控制器:接收来自用户的输入,调用模型层,响应对应的视图组件


 

 

 目录结构:

 代码:

package com.yuyi.struts2.helloworld;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;

/**
 * Servlet Filter implementation class FilterDispatcher
 */
@WebFilter("*.action")
public class FilterDispatcher implements Filter {



    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        HttpServletRequest req=(HttpServletRequest) request;
        //1.获取ServletPath
        String ServletPath=req.getServletPath();
        System.out.println(ServletPath);
        String path=null;
        //2.判断ServletPath,若其等于"/product-input.action",则转发到
        ///WEB_INF/pages/input.jsp
        if("/product-input.action".equals(ServletPath)) {
            path="/WEB-INF/pages/input.jsp";
        }
        //3.若其等于"/product-save.action",则
        //1).获取请求参数
        if("/product-save.action".equals(ServletPath)) {
            String productName=request.getParameter("productName");
            String productDesc=request.getParameter("productDesc");
            String productPrice=request.getParameter("productPrice");

            //2).把请求参数封装为一个Product對象
            Product product=new Product(null, productName, productDesc, Double.parseDouble(productPrice));
            //3).执行保存操作
            System.out.println("Save Product:"+product);
            product.setProductId(1001);
            //4).把Product对象保存到request中,${param.productName}->${requestScope.product.productName}
            request.setAttribute("product", product);
            path="/WEB-INF/pages/details.jsp";
        }
        if(path!=null) {
            request.getRequestDispatcher(path).forward(request, response);
            return;
        }
        chain.doFilter(request, response);
    }


    public void init(FilterConfig fConfig) throws ServletException {

    }

    @Override
    public void destroy() {

    }

}

 

Product.java 

package com.yuyi.struts2.helloworld;

public class Product {

    private Integer productId;
    private String productName;
    private String productDesc;
    private double productPrice;

    public Integer getProductId() {
        return productId;
    }
    public void setProductId(Integer productId) {
        this.productId = productId;
    }
    public String getProductName() {
        return productName;
    }
    public void setProductName(String productName) {
        this.productName = productName;
    }
    public String getProductDesc() {
        return productDesc;
    }
    public void setProductDesc(String productDesc) {
        this.productDesc = productDesc;
    }
    public double getProductPrice() {
        return productPrice;
    }
    public void setProductPrice(double productPrice) {
        this.productPrice = productPrice;
    }
    public Product(Integer productId, String productName, String productDesc, double productPrice) {
        super();
        this.productId = productId;
        this.productName = productName;
        this.productDesc = productDesc;
        this.productPrice = productPrice;
    }
    
    public Product() {
        
    }
}

 

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="product-input.action">Product Input</a>
</body>
</html>

 

input.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="product-save.action" method="post">
      
      ProductName:<input type="text" name="productName"/>
      <br><br>
      
      ProductDesc:<input type="text" name="productDesc"/>
      <br><br>
      
      ProductPrice:<input type="text" name="productPrice"/>
      <br><br>
      <input type="submit" name="Submit"/>
</form>
</body>
</html>

 

details.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

    ProductId:${requestScope.product.productId}
    <br><br>
    
    ProductName:${requestScope.product.productName}
     <br><br>

    ProductDesc:${requestScope.product.productDesc}
    <br><br>
    
    ProductPrice:${requestScope.product.productPrice}
    <br><br>
</body>
</html>

 

以Filter作为控制器的Struts以上任务的步骤:

目录结构:


 

 

1.VS 自实现

1).搭建Struts2的开发环境
2).不需要显式的定义Filter,而是使用Struts2的配置文件。
3).details.jsp比之前变得简单。
${requestScope.product.productName}->${productName}
4).步骤:
1.由product-input.action转到/WEB-INF/pages/input.jsp
在struts配置一个action

<action name="product-input">
<result>/WEB-INF/pages/input.jsp</result>
</action>

2.由input.jsp页面的action:product.save到Product's save,再到/WEB-INF/pages/details.jsp
<action name="product-save" class="com.yuyi.struts2.helloworld.Product"
method="save">
<result name="details">/WEB-INF/pages/details.jsp</result>
</action>

在Product中定义一个save方法,且返回值为details


 

加入jar包,加入jar包的时候记得要到官网下载正确的jar包,我用的版本是struts2-3-35,把jar包复制到lib文件夹下

配置web.xml文件

 

<?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">
        <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>
                <url-pattern>/*</url-pattern>
        </filter-mapping>
</web-app>

 

 

 

配置struts.xml文件

 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
        <!-- package:包,struts使用package来组织模块 
        name属性:必须,用于其他包应用当前包 
        extends:当前继承哪个包,继承的,即可以继承其中所有的配置,通常情况下继承struts-default
        struts-default这个包在struts-default.xml文件中定义
        namespace 属性是可选的, 如果它没有给出, 则以 “/” 为默认值.
         若 namespace 有一个非默认值, 则要想调用这个包里的Action, 
         就必须把这个属性所定义的命名空间添加到有关的 URI 字符串里
         
        http://localhost:8080/contextPath/yuyi/actionName.action
         -->
        <package name="helloWorld" extends="struts-default" >
                <!-- 
                     配置一个action:一个struts2的请求就是一个action 
                  name:对应一个struts2的请求的名字(或对一个servletPath,但去除/和扩展名),不包含扩展名 
                  class的默认值为:com.opensymphony.xwork2.ActionSupport
                  method的默认值为:execute    
                  result:结果
                         -->
                <action name="product-input"
                class="com.opensymphony.xwork2.ActionSupport"
                method="execute">
                <!-- 
                  result:结果.action方法执行后可能返回的一个结果。所以一个action节点可能会有多个result子节点
                  多个result子节点使用name来区分
                  name:标识一个result和action方法的返回值对应。默认值为success
                  type:表示结果的类型。默认值为dispatcher(转发到结果)
                 -->
                        <result name="success" type="dispatcher">/WEB-INF/pages/input.jsp</result>
                </action>

                <action name="product-save" class="com.yuyi.struts2.helloworld.Product"
                method="save">
                <result name="details">/WEB-INF/pages/details.jsp</result>
                </action>
        </package>


</struts>

 

 

Product.java

package com.yuyi.struts2.helloworld;

public class Product {

    private Integer productId;
    private String productName;
    private String productDesc;
    private double productPrice;

    public Integer getProductId() {
        return productId;
    }
    public void setProductId(Integer productId) {
        this.productId = productId;
    }
    public String getProductName() {
        return productName;
    }
    public void setProductName(String productName) {
        this.productName = productName;
    }
    public String getProductDesc() {
        return productDesc;
    }
    public void setProductDesc(String productDesc) {
        this.productDesc = productDesc;
    }
    public double getProductPrice() {
        return productPrice;
    }
    public void setProductPrice(double productPrice) {
        this.productPrice = productPrice;
    }
    @Override
    public String toString() {
        return "Product [productId=" + productId + ", productName=" + productName + ", productDesc=" + productDesc
                + ", productPrice=" + productPrice + "]";
    }
    
    public String save() {
        System.out.println("save:"+this);
        return "details";
    }
}

 

index.jsp和input.jsp没有区别,details.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

    ProductId:${productId}
    <br>
    <br> ProductName:${productName}
    <br>
    <br> ProductDesc:${productDesc}
    <br>
    <br> ProductPrice:${productPrice}
    <br>
    <br>
</body>
</html>

 

 

这样我们就可以理解Struts作为控制器的运行原理,它比原来我们自己敲代码更加简便和操作 

posted on 2018-08-28 11:52  王育奕  阅读(111)  评论(0编辑  收藏  举报

导航