上一篇简单的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的原理流程就能够明白每一步的作用了吧!