上一篇文章中所提到在Model2模型里是利用Servlet控制器或者过滤器来接收来自用户输入并控制模型和视图部分做出相应的变化,其中核心部分是对URI进行处理,然后做出一系列的动作,最终将内容显示在浏览器上。下面的两段代码分别展示了用Servlet和过滤器来充当Model2当中的控制器。
Servlet控制器的核心代码
package struts2_01;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sun.tools.ws.processor.model.Request;
public class ControllerServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
process(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
process(req,resp);
}
private void process(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException{
String uri=request.getRequestURI();
int lastIndex=uri.lastIndexOf("/");
String action=uri.substring(lastIndex+1);
if(action.equals("Product_input.action")){
}else if(action.equals("Product_save.action")){
Product product=new Product();
product.setProductName(request.getParameter("productName"));
product.setDescription(request.getParameter("description"));
product.setPrice(request.getParameter("price"));
product.save();
request.setAttribute("product", product);
}
String dispathUrl=null;
if(action.equals("Product_intput.action")){
dispathUrl="ProductForm.jsp";
}else if(action.equals("Product_save.action")){
dispathUrl="ProductDetails.jsp";
}
if(dispathUrl!=null){
RequestDispatcher rd=request.getRequestDispatcher(dispathUrl);
rd.forward(request, response);
}
}
}
上面的Servlet控制器,类似于Struts1当中的核心控制器。在Struts1中页面将所有请求发到核心控制器上,然后核心控制器通过之前已经读取的配置文件信息再将请求转到对应的Action中,最终完成页面的显示。
过滤器控制器核心代码
package struts2_01;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FilterDispatcher implements Filter{
private FilterConfig filterConfig;
@Override
public void destroy() {
this.filterConfig=null;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req=(HttpServletRequest)request;
HttpServletResponse res=(HttpServletResponse)response;
String uri=req.getRequestURI();
if(uri.endsWith(".action")){
int lastIndex=uri.lastIndexOf("/");
String action=uri.substring(lastIndex+1);
if(action.equals("Product_input.action")){
}else if(action.equals("Product_save.action")){
Product product=new Product();
product.setProductName(request.getParameter("productName"));
product.setPrice(request.getParameter("price"));
product.setDescription(request.getParameter("description"));
product.save();
request.setAttribute("product", product);
}
String dispatchUrl=null;
if(action.equals("Product_input.action")){
dispatchUrl="/ProducForm.jsp";
}else if(action.equals("Product_save.action")){
dispatchUrl="/ProductDetails.jsp";
}
if(dispatchUrl!=null){
RequestDispatcher rd=request.getRequestDispatcher(dispatchUrl);
rd.forward(request, response);
}
else if(uri.indexOf("/css/")!=-1 && req.getHeader("referer")==null){
res.sendError(HttpServletResponse.SC_FORBIDDEN);
}else{
chain.doFilter(request, response);
}
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig=filterConfig;
System.out.println("--------init()-------");
}
}
上面的过滤器控制器类似于Struts2当中的核心控制器。在Struts2中控制器过滤所有请求,将特殊的请求交给核心控制器处理,然后借助之前读取的配置文件,以及用户自己编写的Action,将请求交给Action的代理去处理(这也是为什么说Struts2不具有侵入性的原因),然后交给下一个过滤器,最终完成页面显示。
两个控制器所做的事情是一致的,首先得到请求的URI,然后根据不同的URI进行不同的操作,例如:获得页面传过来的数据、将处理后的数据返回给页面、进行页面跳转等等。唯一不同的是Servlet控制器是被请求来处理的;而过滤器是将请求过滤下来,然后进行处理,最终交给下一个过滤器。在后面的文章中将详细讲述Struts1和Struts2当中核心控制器的执行过程。