Mvc设计模式概述

实现mvc设计模式

应用程序由3大部分构成

模型:封装应用程序的数据和业务逻辑POJP(Plain Old Java Object)

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

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

 

Struts2 用FilterDispatcher作为控制器

 

 

转发页面以前是

Request.getRequestDispatcher().forward();方法完成

 

Filter本身是一个过滤器 ,可以对servlet的访问进行一个控制

 

Servlet  VS  Filter

Servlet能做的 Filter都可以完成

Filter能做的Servlet都可以完成吗 ? 拦截资源不是Servlet所擅长的!

Filter中有一个FilterChain,这个API在Servlet中没有!要拦截资源的话 Filter比较擅长

 

 

Struts2的概述:用来开发mvc应用程序的框架

         对来自用户的输入数据进行合法性验证

         统一的布局

         可扩展性

         国际化和本地化

         支持Ajax

         表单的重复提交

         文件的上传下载

         …….

Struts2在体系结构方面更优秀

类更少 ,更高效

在Struts2中无响应使用”ActionForm”来封装请求参数。

扩展容易:Struts2通过拦截器完成了框架的大部分工作。在Struts2中插入一个拦截器对象相当简便易行。

更容易测试:即使不适用浏览器也可以对基于Struts2的应用进行测试.

意思是测试的时候可以没有任何Servlet Api 可以没有request或者response

 

Struts1中,Action类必须继承org.apache.struts.action.Action类,

Struts2任何一个PoJo都可以是一个Action类。

 

Struts2在页面里面使用OGNL来显示各种对象模型,可以不再使用EL和JSTL表达式,但也可以用。

 

Servlet中利用Filter 做控制器来进行控制

 

控制器Filter

package com.atguigu.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.http.HttpServletRequest;

 

public class FilterDispatcher implements Filter{

 

         public void destroy() {

                  

         }

 

         public void doFilter(ServletRequest request, ServletResponse response,

                            FilterChain filter) throws IOException, ServletException {

                   HttpServletRequest req = (HttpServletRequest) request;

                   String servletPath = req.getServletPath();//项目名后面的路径

                   String contextPath=req.getContextPath();//项目名

                  

                   System.out.println(servletPath);

                   System.out.println(contextPath);

                   //1,.获取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",则

                  

                   if("/product-save.action".equals(servletPath)){

                            //1获取请求参数

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

                            //到这一步已经给了个相应 ,所以不能再调用filter.doFilter否则会报错

                            return;

                   }

                  

                   filter.doFilter(request, response);

         }

 

         public void init(FilterConfig arg0) throws ServletException {

                  

         }

}

 

 

Web.xml中配置Filter对请求进行拦截

<filter>

       <filter-name>servlet-filter</filter-name>

       <filter-class>com.atguigu.struts2.helloworld.FilterDispatcher</filter-class>

    </filter>

    <filter-mapping>

       <filter-name>servlet-filter</filter-name>

       <url-pattern>*.action</url-pattern>

    </filter-mapping>

 

Index.jsp

<body>

   <a href="product-input.action">Product Input</a>

  </body>

 

 

Input.jsp

<body>

       <form action="product-save.action">

           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" value="Submit"/>

       </form>

  </body>

Details.jsp

 

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