深入理解strus,根据MVC自己动手搭建Struts基础框架

上一篇简单的MVC搭建中的StrutsServet.Java控制类,我们发现其有很多的不方便性:

package com.suo;

import java.io.IOException;

import javax.management.RuntimeErrorException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
 * 使用该servlet做做控制模块,分别专项不同的视图
 * 
 */
public class StrutsServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		
		//获取访问URI
		String requestURI= req.getRequestURI();
		
		//获取访问路径
		String path= requestURI.substring(requestURI.indexOf("/", 1), requestURI.indexOf("."));
		
		//获取表单提交数据
		String name = req.getParameter("name");
		//创建业务类
		UserService userService=new UserService();
		//定义跳转路径
		String forward ="";
		//根据访问路径,实现视图跳转
		if("/servlet/addUser".equals(path)){
			
			userService.addUser(name);
			forward="/add_success.jsp";
		}else if("/servlet/deleteUser".equals(path)){
			
			userService.deleteUser(name);
			forward="/delete_success.jsp";
			
		}else if("/servlet/updateUser".equals(path)){
			
			userService.updateUser(name);
			forward="/update_success.jsp";
			
		}else if("/servlet/queryUser".equals(path)){
			
			userService.queryUser(name);
			forward="/query_success.jsp";
			
		}else{
			throw new RuntimeException("请求失败");
		}
		req.getRequestDispatcher(forward).forward(req, resp);		
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(req, resp);
	}
	
}
在这我们就将其中的获取表单参数、业务逻辑处理和返回页面(即图中标红的部分)提取出来;
提取出一个公共借口UserAction;
package com.suo;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface UserAction {

	public String execute(HttpServletRequest req,HttpServletResponse resp);
	
	
}
添加用户实现类:

package com.suo;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AddUserAction implements UserAction {

	@Override
	public String execute(HttpServletRequest req, HttpServletResponse resp) {
		
		String name=req.getParameter("name");		
		//逻辑业务处理
		UserService userService=new UserService();
		userService.addUser(name);
		
		return "/add_success.jsp";
	}	
	
}

修改用户实现类:
package com.suo;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class UpdateUserAction implements UserAction{

	@Override
	public String execute(HttpServletRequest req, HttpServletResponse resp) {
		
		String name= req.getParameter("name");		
		//逻辑业务处理
		UserService userService=new UserService();
		userService.updateUser(name);	
			
		return "/update_success.jsp";
	}

}

<!-- 剩下的删除、查询类似-->

StrutsServlet类就缩减成:

package com.suo;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
 * 使用该servlet做做控制模块,分别专项不同的视图
 * 
 */
public class StrutsServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		
		//获取访问URI
		String requestURI= req.getRequestURI();
		
		//获取访问路径
		String path= requestURI.substring(requestURI.indexOf("/", 1), requestURI.indexOf("."));
		
		//获取表单提交数据
		//String name = req.getParameter("name");
		//创建业务类
		//UserService userService=new UserService();
		 UserAction action = null;
		//定义跳转路径
		String forward ="";
		//根据访问路径,实现视图跳转
		if("/servlet/addUser".equals(path)){
               //	userService.deleteUser(name);
			   //   forward="/delete_success.jsp";
			   action=new AddUserAction();
		}else if("/servlet/deleteUser".equals(path)){
			
		//	userService.deleteUser(name);
			//forward="/delete_success.jsp";
			action=new DeleteUserAction();
			
		}else if("/servlet/updateUser".equals(path)){
			
			//userService.updateUser(name);
			//forward="/update_success.jsp";
			action=new UpdateUserAction();
		}else if("/servlet/queryUser".equals(path)){
			
			//userService.queryUser(name);
			//forward="/query_success.jsp";
			  action=new QueryUserAction();
		}else{
			throw new RuntimeException("请求失败");
		} 
		      //赋值得到跳转路径
		  forward=action.execute(req, resp);
		req.getRequestDispatcher(forward).forward(req, resp);		
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(req, resp);
	}
	
}
源码下载: 点击打开链接

虽然我们将参数获取、业务逻辑处理以及页面返回提取出去,但是其中的多个if else看了很是让人头疼,所以我们将其放入到一个XML文件中进行管理;

struts.xml

<?xml version="1.0" encoding="UTF-8"?>

<action-config>  
    <action-mappings>  
              <!- -添加访问路径与实体类的对应- -》
        <action path="/servlet/deleteUser" type="com.suo.DeleteUserAction"> 
              <!-- 此处可添加多个forward-->
            <forward name="delete_success" path="/delete_success.jsp"></forward> 
         </action>
        <action path="/servlet/addUser" type="com.suo.AddUserAction">
            <forward name="add_success" path="/add_success.jsp"></forward> 
        </action>     
        <action path="/servlet/updateUser" type="com.suo.UpdateUserAction">
             <forward name="update_success" path="/update_success.jsp"></forward>  
        </action>      
        <action path="/servlet/queryUser" type="com.suo.QueryUserAction"> 
             <forward name="query_success" path="/query_success.jsp"></forward> 
        </action> 
    </action-mappings>  
</action-config>  
(注:因为下面定义的map没有区分path,所以forward 那么不能重复,如若 想区分可以在家一个map.)

对应的ActionMapper类;

package com.suo;

import java.util.HashMap;
import java.util.Map;

public class ActionMapper {
	  
	/**
	 * 定义struts.xml的action路径——类型Map
	 */
	public static final Map<String, String> ACTION_PATH_TYLE_MAP=new HashMap<String, String>();
   /**
    * 定义struts.xml中返回视图的Map
    */
	public static final Map<String, String> ACTION_PATH_VIEW_MAP=new HashMap<String, String>();
	
}


处理xml文件的类:Config.java

package com.suo;

import java.io.File;
import java.util.Iterator;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class Config {
	public static void init(String config) {  
        // 创建saxReader对象  
        SAXReader reader = new SAXReader();  
        File f = new File(config);  
        try {  
            // 通过read方法读取xml文件, 转换成Document对象  
            Document doc = reader.read(f);  
            // 得到配置文件的根结点  
            Element root = doc.getRootElement();  
            Element actionmappings = (Element) root.element("action-mappings");  
            // 解析action结点的所有参数  
            for (Iterator j = actionmappings.elementIterator("action"); j  
                    .hasNext();) {  
                Element am = (Element) j.next();  
                
                // 解析forward结点的所有参数  
                for (Iterator k = am.elementIterator("forward"); k.hasNext();) {  
                    Element fo = (Element) k.next();  
                    //讲forward页面放入Map
                ActionMapper.ACTION_PATH_VIEW_MAP.put((String) fo.attributeValue("name"), (String)fo.attributeValue("path"));
                }    
                            //讲action对应的路径和实体类放入map
                  ActionMapper.ACTION_PATH_TYLE_MAP.put(am.attributeValue("path"), am.attributeValue("type"));                            
                  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
	
	
	
	
}
StrutsSeivlet.java(可简化为)

package com.suo;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
 * 使用该servlet做做控制模块,分别专项不同的视图
 * 
 */
public class StrutsServlet extends HttpServlet {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	//需要读取的文件名  
    protected static String config = "/WEB-INF/sturts.xml";  
  
    public void init() throws ServletException {  
    
        //根据web.xml中映射的目录获得文件在对应服务器中的真实路径  
        config = getServletContext().getRealPath("/")+ getInitParameter("config");  
        //解析struts-config.xml配置文件  
        Config.init(config);  
    }  
  
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException { 
	          
	        //取得访问的URI  
	        String reqeuestURI = req.getRequestURI();  
	        //截取URI,获得路径  
	        String path = reqeuestURI.substring(reqeuestURI.indexOf("/",1), reqeuestURI.indexOf("."));  
         
	        //取得本请求对应的Action类的完整路径  
	        String type = ActionMapper.ACTION_PATH_TYLE_MAP.get(path);  
	        //采用反射,动态实例化Action  
	        try {  
	            UserAction action = (UserAction)Class.forName(type).newInstance();  
	            // 采用多态的机制,动态调用Action中的execute方法,返回转向路径  
	            String result = action.execute(req, resp);  
	              
	            String forward =ActionMapper.ACTION_PATH_VIEW_MAP.get(result);
	            //根据转向路径完成转向  
	            req.getRequestDispatcher(forward).forward(req, resp);  
	        } catch (InstantiationException e) {  
	            e.printStackTrace();  
	        } catch (IllegalAccessException e) {  
	            e.printStackTrace();  
	        } catch (ClassNotFoundException e) {  
	            e.printStackTrace();  
	        } catch (Exception e) {  
	            e.printStackTrace();  
	        }  
	             
	    }  	
	

	//此处一下为简化前的代码,列到这方便大家对比
	
	/*	//获取访问URI
		String requestURI= req.getRequestURI();
		
		//获取访问路径
		String path= requestURI.substring(requestURI.indexOf("/", 1), requestURI.indexOf("."));
		
		//获取表单提交数据
		//String name = req.getParameter("name");
		//创建业务类
		//UserService userService=new UserService();
		 UserAction action = null;
		//定义跳转路径
		String forward ="";
		//根据访问路径,实现视图跳转
		if("/servlet/addUser".equals(path)){
               //	userService.deleteUser(name);
			   //   forward="/delete_success.jsp";
			   action=new AddUserAction();
		}else if("/servlet/deleteUser".equals(path)){
			
		//	userService.deleteUser(name);
			//forward="/delete_success.jsp";
			action=new DeleteUserAction();
			
		}else if("/servlet/updateUser".equals(path)){
			
			//userService.updateUser(name);
			//forward="/update_success.jsp";
			action=new UpdateUserAction();
		}else if("/servlet/queryUser".equals(path)){
			
			//userService.queryUser(name);
			//forward="/query_success.jsp";
			  action=new QueryUserAction();
		}else{
			throw new RuntimeException("请求失败");
		} 
		      //赋值得到跳转路径
		  forward=action.execute(req, resp);
		req.getRequestDispatcher(forward).forward(req, resp);		
	}
*/
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(req, resp);
	}
	
}

AddUserAction.java(剩下的增删改查Action类似,不再列出)

package com.suo;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AddUserAction implements UserAction {

	@Override
	public String execute(HttpServletRequest req, HttpServletResponse resp) {
		
		String name=req.getParameter("name");		
		//逻辑业务处理
		UserService userService=new UserService();
		userService.addUser(name);
		
		return "add_success";
	}	
	
}

上面程序源码下载地址:点击打开链接

接下来再看Strus的原理流程就能够明白每一步的作用了吧!







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值