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>