//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;
}
}
}