手写mvc框架(代码)

来源:互联网 发布:哲学书籍推荐知乎 编辑:程序博客网 时间:2024/05/18 00:34

            //Action

package org.accp.mvcch2.framework;

import java.io.IOException;

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

public interface Action {

 String SUCCESS="success";
 String FAILURE="failure";
 String INPUT = "input";
 String MESSAGE = "message";
 
 public String execute(HttpServletRequest request,HttpServletResponse response)
 throws ServletException, IOException ;

}

 

             //ActionManager

package org.accp.mvcch2.framework;

public class ActionManager {

 public static Action createAction(String className) {
  try {
   return (Action) loadClass(className).newInstance();
  } catch (InstantiationException e) {
   e.printStackTrace();
  } catch (IllegalAccessException e) {
   e.printStackTrace();
  }
  return null;
 }


 public static Class loadClass(String className) {
  Class clazz = null;
  try {
   clazz = Thread.currentThread().getContextClassLoader().loadClass(
     className);
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
  }
  if (clazz == null) {
   try {
    clazz = Class.forName(className);
   } catch (ClassNotFoundException e) {
    e.printStackTrace();
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
  return clazz;
 }
}

 

//ActionMapping

package org.accp.mvcch2.framework;

/**封装Action的映射信息*/
public class ActionMapping {
 
 private String name;
 private String className;
 private java.util.Map<String,String> resultMap = new java.util.HashMap<String, String>();
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getClassName() {
  return className;
 }
 public void setClassName(String className) {
  this.className = className;
 }
 public java.util.Map<String, String> getResultMap() {
  return resultMap;
 }
 public void setResultMap(java.util.Map<String, String> resultMap) {
  this.resultMap = resultMap;
 }

}


 

//ActionMappingManager

package org.accp.mvcch2.framework;

import java.io.InputStream;

import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.dom4j.tree.DefaultElement;

public class ActionMappingManager {
 Logger log = Logger.getLogger(ActionMappingManager.class);
 
 private java.util.Map<String,ActionMapping> actionMappingMap = new java.util.HashMap<String,ActionMapping>();
 
 
 private void init(String configLocation) throws DocumentException{
  InputStream is = this.getClass().getResourceAsStream("/"+configLocation);
  SAXReader reader = new SAXReader();
  Document doc = reader.read(is);
  java.util.List list =  doc.selectNodes("/mystruts/actions/action");
  for (Object actionItem : list) {
   if (actionItem instanceof DefaultElement){
    Element actionElement = (Element)actionItem;
    String name = actionElement.attribute("name").getValue();
    String className = actionElement.attribute("class").getValue();
    ActionMapping actionMapping = new ActionMapping();
    
    actionMapping.setName(name);
    actionMapping.setClassName(className);
    java.util.Iterator iter =  actionElement.elementIterator("result");
    if (iter!=null){
     while(iter.hasNext()){
      Element resultElement = (Element)iter.next();
      actionMapping.getResultMap().put(resultElement.attributeValue("name"), resultElement.getTextTrim());      
     }
    }
    
    actionMappingMap.put(actionMapping.getName(), actionMapping);
    
   }
  }
 }
 
 public ActionMapping getActionMappingByName(String actionName){
  return actionMappingMap.get(actionName);
 }
 
 public ActionMappingManager(String configLocation) throws DocumentException {
  // TODO Auto-generated constructor stub
  if (configLocation==null || "".equals(configLocation)){
   throw new RuntimeException("没有配置文件,创建ActionManager失败");
  }
  init(configLocation);  
 }
 
 public static void main(String[] args) throws DocumentException {
  ActionMappingManager actionManager = new ActionMappingManager("mystruts.xml");
  ActionMapping actionMapping =  actionManager.getActionMappingByName("login");
  
  for(String key: actionMapping.getResultMap().keySet()){
   System.out.println(key+"="+actionMapping.getResultMap().get(key));
  }
 }

}

//ActionServlet

package org.accp.mvcch2.framework;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.accp.mvcch2.web.LoginAction;
import org.apache.log4j.Logger;
import org.dom4j.DocumentException;

public class ActionServlet extends HttpServlet {
 Logger log = Logger.getLogger(ActionServlet.class);
 
 
 private String  configLocation="mystruts.xml";
 ActionMappingManager actionMappingManager;
 
 
 
 @Override
 public void init(ServletConfig config) throws ServletException {
  log.debug("executing init().....");
  if (config.getInitParameter("configLocation")!=null)
   configLocation = config.getInitParameter("configLocation");
  log.debug("config file name is "+configLocation);
  try {
   actionMappingManager = new ActionMappingManager(configLocation);
  } catch (DocumentException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

 @Override
 protected void service(HttpServletRequest arg0, HttpServletResponse arg1)
   throws ServletException, IOException {
  log.debug("start executing service()...");
  log.debug("executing getActionMapping()");
  ActionMapping actioinMapping = getActionMapping(arg0);//根据URI得到ActioinMapping对象
  log.debug("executing getAction()");
  Action action = getAction(actioinMapping);//得到Action对象
  log.debug("executing action.execute()");
  String result = action.execute(arg0, arg1);//执行Action并得到返回值[跳转key]
  log.debug("get forward page");
  String pageurl = actioinMapping.getResultMap().get(result);//得到跳转页面
  log.debug("forward page is "+pageurl);
  arg0.getRequestDispatcher(pageurl).forward(arg0, arg1);
  log.debug("end executing service()...\n\n");
 }
 
 private ActionMapping getActionMapping(HttpServletRequest request){
  //获取请求的uri
       String uri = request.getRequestURI();
       //获取上下文路径
       String contextPath = request.getContextPath();
       //截取上下文路径以后的部分
       String actionPath = uri.substring(contextPath.length());
       //获取Action 名称
       String actionName =                
       actionPath.substring(1,actionPath.lastIndexOf('.')).trim();
      
       log.debug("actionName="+actionName);
       Action action = null;
      //添加新功能时在这里添加
//      if("login".equals(actionName)){
//             action = new LoginAction();
//       } else if ("register".equals(actionName)){
//        //action = new RegisterAction();
//       }
      
       //引入ActionMapping之后
       ActionMapping actionMapping = actionMappingManager.getActionMappingByName(actionName);
       return actionMapping;
 }
 
 /**根据请求URI确定要构造那个Action实例*/
 private Action getAction(ActionMapping actionMapping){     
      
      return ActionManager.createAction(actionMapping.getClassName());
 }

}

 

//自己写的xml文件(mystruts.xml)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mystruts[
<!ELEMENT mystruts (actions)>
<!ELEMENT actions (action*)>
<!ELEMENT action (result*)>
<!ATTLIST action
name CDATA #REQUIRED
class CDATA #REQUIRED>
<!ELEMENT result (#PCDATA)>
<!ATTLIST result
name CDATA #IMPLIED
redirect (true|false) "false">
]>
<mystruts>
 <actions>
  <action name="login" class="org.accp.mvcch2.web.LoginAction">
   <result name="success" redirect="true">page/manage.jsp</result>
   <result name="input">page/login.jsp</result>
  </action> 
  <action name="register" class="org.accp.mvcch2.web.RegAction">
   <result name="success">page/login.jsp</result>
   <result name="input">page/reg.jsp</result>
  </action>    
 </actions>
</mystruts>

 

//web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 <welcome-file-list>
  <welcome-file>index.jsp</welcome-file>
 </welcome-file-list>
 <servlet>
  <servlet-name>actionServlet</servlet-name>
  <servlet-class>org.accp.mvcch2.framework.ActionServlet</servlet-class>
  <init-param>
   <param-name>configLocation</param-name>
   <param-value>mystruts.xml</param-value>
  </init-param>
 </servlet>
 <servlet-mapping>
  <servlet-name>actionServlet</servlet-name>
  <url-pattern>*.action</url-pattern>
 </servlet-mapping>
</web-app>

 

//一个简单的登陆 (使用自定义的mvc)

package org.accp.mvcch2.web;

import java.io.IOException;

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

import org.accp.mvcch2.entities.User;
import org.accp.mvcch2.framework.Action;

 

public class LoginAction implements Action {

 @Override
 public String execute(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {
  String name = request.getParameter("name");
        String password = request.getParameter("password");
        //业务处理
//        UserBiz ub = new UserBizImpl();
//        User user = ub.login(name, password);
        User user = new User();
        user.setName("admin");
        user.setPassword("admin");
        if (name.equals("admin") && password.equals("admin")){
         request.getSession().setAttribute("login", user);
            return SUCCESS;
        } else{
          request.setAttribute("message", "用户名或密码错误");
             return INPUT;
        }

 }

}


 

 


 

 

 

原创粉丝点击