zoukankan      html  css  js  c++  java
  • Model2中的两种控制器

    上一篇文章中所提到在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控制器是被请求来处理的;而过滤器是将请求过滤下来,然后进行处理,最终交给下一个过滤器。在后面的文章中将详细讲述Struts1Struts2当中核心控制器的执行过程。

    原创文章,转载请注明出处:http://www.cnblogs.com/beijiguangyong/
  • 相关阅读:
    发行版Linux和麒麟操作系统下netperf 网络性能测试
    Linux下RPM包的安装
    CentOS7下安装NVIDIA独立显卡驱动出现X service error问题解决方法
    真实的物理机安装Centos7系统后网卡只有lo没有eno1的解决办法:实际上是物理机未安装网驱动卡
    Windows7系统下OpenCV2.4.4+PCL1.6.0+SSBA3.0+VS2010 IDE32环境下编译和安装以实现Sfm和PCL点云数据可视化
    VC++编译错误error C2065: “HANDLE”: 未声明的标识符及添加winbase.h后提示winbase.h(243): error C2146: 语法错误: 缺少“;”(在标识符“Internal”的前面)的解决办法
    [转]VS2013+简单稀疏光束调整库SSBA配置(64位编译)
    std::max、std::min error C2589: “(”:“::”右边的非法标记,error C2059: 语法错误:“::”
    理解图像卷积和滤波的典型博文
    [转]OPENCV3.3+CUDA9.0 环境搭建若干错误总结
  • 原文地址:https://www.cnblogs.com/beijiguangyong/p/2890249.html
Copyright © 2011-2022 走看看