Struts,经典框架之一,每个java  web 开发人员都应该晓得它的大名。这里,我就用一个简单实例来模拟一下struts的核心流程。具体实例如下:

主界面:

点击提交后,程序根据具体的action,跳转到不同的页面。下面看一下具体的实现代码。

文件树:

ActionConfig.xml 代码:

<?xml version="1.0" encoding="UTF-8"?>
<action-config>
<action path = "/addUser.action" type = "com.tigaoban.manager.AddUserAction">
<forward name = "success">/addSuccess.jsp</forward>
<forward name = "error">/addError.jsp</forward>
</action> <action path = "/delUser.action" type = "com.tigaoban.manager.DelUserAction">
<forward name = "success">/delSuccess.jsp</forward>
<forward name = "error">/delError.jsp</forward>
</action> <action path = "/modifyUser.action" type = "com.tigaoban.manager.ModifyUserAction">
<forward name = "success">/modifySuccess.jsp</forward>
<forward name = "error">/modifyError.jsp</forward>
</action> <action path = "/queryUser.action" type = "com.tigaoban.manager.QueryUserAction">
<forward name = "success">/querySuccess.jsp</forward>
<forward name = "error">/queryError.jsp</forward>
</action>
</action-config>

ActionMapping 代码:

package com.tigaoban.domain;

import java.util.Map;

public class ActionMapping {
private String path; private String type; private Map<String, String> forwardMap; public String getPath() {
return path;
} public void setPath(String path) {
this.path = path;
} public String getType() {
return type;
} public void setType(String type) {
this.type = type;
} public Map<String, String> getForwardMap() {
return forwardMap;
} public void setForwardMap(Map<String, String> forwardMap) {
this.forwardMap = forwardMap;
}
}

XmlConfigReader 代码:

package com.tigaoban.util;

import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map; import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; import com.tigaoban.domain.ActionMapping; /**
* 采用单例模式解析ActionConfig.xml文件
* @author Haitao
*
*/
public class XmlConfigReader { //懒汉式
private static XmlConfigReader instance = null;//XmlConfigReader 实例 //key=名称,value = 具体的动作实体类
private Map<String, ActionMapping> actionMap = new HashMap<String, ActionMapping>(); /**
* 构造方法
*/
private XmlConfigReader(){
SAXReader reader = new SAXReader();
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("ActionConfig.xml"); try {
Document doc = reader.read(in); //取得Action相关的配置信息,并存入ActionMapping实体中
List<Element> actionList = doc.selectNodes("//action");
for (Iterator<Element> iter = actionList.iterator(); iter.hasNext();){
Element element = iter.next(); String path = element.attributeValue("path");
String type = element.attributeValue("type");
//System.out.println(path); List<Element> forwardList = element.elements("forward");
//存放forward中信息的map
Map<String,String> forwardMap = new HashMap<String, String>(); for (Iterator<Element> iterator = forwardList.iterator();iterator.hasNext();){
Element forward = iterator.next();
String name = forward.attributeValue("name");
String value = (String)forward.getData();
forwardMap.put(name, value);
} //新建ActionMapping实体
ActionMapping actionMapping = new ActionMapping();
actionMapping.setPath(path);
actionMapping.setType(type);
actionMapping.setForwardMap(forwardMap); //将actionMapping放入map中
actionMap.put(path, actionMapping); }
} catch (DocumentException e) {
e.printStackTrace();
}
} public static synchronized XmlConfigReader getInstance() {
if(instance == null){
instance = new XmlConfigReader();
}
return instance;
} /**
* 取得action相关配置
* @return
*/
public Map<String, ActionMapping> getMap() {
return actionMap;
} }

UserManager代码:

package com.tigaoban.manager;

import java.util.ArrayList;
import java.util.List; public class UserManager {
public void addUser(String username){
System.out.println("添加成功" + username);
} public void delUser(String username){
System.out.println("删除成功" + username);
} public void modifyUser(String username){
System.out.println("修改成功" + username);
} public List<String> queryUser(String username){
System.out.println("查询成功" + username);
List<String> userList = new ArrayList<String>();
userList.add("a");
userList.add("b");
userList.add("c");
return userList; }
}

Action代码:

package com.tigaoban.manager;

import javax.servlet.http.*;

public interface Action {
public String execute(HttpServletRequest request,HttpServletResponse response)
throws Exception;
}

AddUserAction代码

package com.tigaoban.manager;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class AddUserAction implements Action { @Override
public String execute(HttpServletRequest request,
HttpServletResponse response) throws Exception {
String userName = request.getParameter("userName"); UserManager userManager = new UserManager();
userManager.addUser(userName);
return "/addSuccess.jsp";
} }

DelUserAction代码:

package com.tigaoban.manager;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class DelUserAction implements Action { @Override
public String execute(HttpServletRequest request,
HttpServletResponse response) throws Exception { String userName = request.getParameter("userName");
UserManager userManager = new UserManager();
userManager.delUser(userName);
return "/delSuccess.jsp";
} }

ModifyUserAction代码:

package com.tigaoban.manager;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class ModifyUserAction implements Action { @Override
public String execute(HttpServletRequest request,
HttpServletResponse response) throws Exception { String userName = request.getParameter("userName");
UserManager userManager = new UserManager();
userManager.modifyUser(userName);
return "/modifySuccess.jsp";
} }

QueryUserAction代码:

package com.tigaoban.manager;

import java.util.Iterator;
import java.util.List; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class QueryUserAction implements Action { @Override
public String execute(HttpServletRequest request,
HttpServletResponse response) throws Exception { String userName = request.getParameter("userName");
UserManager userManager = new UserManager();
List<String> userList = userManager.queryUser(userName);
for (Iterator<String> itor = userList.iterator();itor.hasNext();){
String user = itor.next();
System.out.println(user);
}
return "/querySuccess.jsp";
} }

TestServlet代码

package com.tigaoban.servlet;

import java.io.IOException;
import java.util.*; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import com.tigaoban.domain.ActionMapping;
import com.tigaoban.manager.Action;
import com.tigaoban.util.XmlConfigReader; @SuppressWarnings("serial")
public class TestServlet extends HttpServlet { @Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { String requestUrl = request.getServletPath();
String path = requestUrl.substring(requestUrl.indexOf("/",1),requestUrl.length());
//System.out.println(path); String forward = "";
Action action = null; //取得actionMap
Map<String,ActionMapping> actionMap = XmlConfigReader.getInstance().getMap(); //根据path取得对应的ActionMapping
ActionMapping actionMapping = (ActionMapping)actionMap.get(path); //取得本请求对应的Action类的完整路径
String type = actionMapping.getType(); try {
//使用反射动态实例化Action
action = (Action)Class.forName(type).newInstance();
} catch (InstantiationException e1) {
e1.printStackTrace();
} catch (IllegalAccessException e1) {
e1.printStackTrace();
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
}
try {
forward = action.execute(request, response);
} catch (Exception e) {
e.printStackTrace();
} response.sendRedirect(request.getContextPath() + forward);
} }

一下是几个很简单的jsp页面:

user.jsp页面:

<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>Insert title here</title>
</head>
<body>
<form action="servlet/addUser.action" method="post">
姓名:<input type ="text" name = "userName" /><br>
<input type="submit" value="提交"/>
</form>
</body>
</html>

addSuccess.jsp、modifySuccess.jsp、delSuccess.jsp、querySuccess.jsp页面:

<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>Insert title here</title>
</head>
<body>
添加/修改/删除/查询成功!
</body>
</html>

以上就是struts的核心流程,明白了这个例子,相信对你理解struts有很大帮助。

实例模拟struts核心流程的更多相关文章

  1. dubbo核心流程一览

    整体设计 图中从下至上分为十层,各层均为单向依赖,右边的黑色箭头代表层之间的依赖关系,每一层都可以剥离上层被复用,其中,Service 和 Config 层为 API,其它各层均为 SPI. Serv ...

  2. 【Spring专场】「IOC容器」不看源码就带你认识核心流程以及运作原理

    这是史上最全面的Spring的核心流程以及运作原理的分析指南 [Spring核心专题]「IOC容器篇」不看繁琐的源码就带你浏览Spring的核心流程以及运作原理 [Spring核心专题]「AOP容器篇 ...

  3. 无需debug,通过抽象模型快速梳理代码核心流程

    上一篇我们通过DSM来确定了核心对象并构建了抽象模型.本篇是<如何高效阅读源码>专题的第八篇,我们来基于抽象模型来梳理核心流程. 本节主要内容: 如何通过抽象模型来梳理核心流程 从类名和注 ...

  4. paip.刮刮卡砸金蛋抽奖概率算法跟核心流程.

    paip.刮刮卡砸金蛋抽奖概率算法跟核心流程. #---抽奖算法需要满足的需求如下: 1 #---抽奖核心流程 1 #---问题???更好的算法 2 #---实际使用的扩展抽奖算法(带奖品送完判断和每 ...

  5. ibatis源码学习1_整体设计和核心流程

    背景介绍ibatis实现之前,先来看一段jdbc代码: Class.forName("com.mysql.jdbc.Driver"); String url = "jdb ...

  6. KVM Run Process之KVM核心流程

    在"KVM Run Process之Qemu核心流程"一文中讲到Qemu通过KVM_RUN调用KVM提供的API发起KVM的启动,从这里进入到了内核空间执行,本文主要讲述内核中KV ...

  7. 反射学习2-通过反射机制动态获取属性的值模拟Struts的自动赋值

    一.准备知识:   Java反射机制   处理事务的JavaBean   String的操作常用方法 二.模拟步骤   这里我们通过反射机制动态获取属性的值模拟Struts中的自动赋值. 1.首先创建 ...

  8. 2017.3.31 spring mvc教程(二)核心流程及配置详解

    学习的博客:http://elf8848.iteye.com/blog/875830/ 我项目中所用的版本:4.2.0.博客的时间比较早,11年的,学习的是Spring3 MVC.不知道版本上有没有变 ...

  9. Nginx核心流程及模块介绍

    Nginx核心流程及模块介绍 1. Nginx简介以及特点 Nginx简介: Nginx (engine x) 是一个高性能的web服务器和反向代理服务器,也是一个IMAP/POP3/SMTP服务器 ...

随机推荐

  1. CentOS6.5编译安装最新MySQL 5.7.11

    安装前工作:1,从官方网址下载MySQL5.7.11源码包,大概49M2,安装好CentOS6.5 64位操作系统.建议update操作系统,以便是此版本最新的3. yum -y install  g ...

  2. JavaScript的DOM操作(三)

    1.相关元素操作: var a = document.getElementById("id"); var b = a.nextSibling,找a的下一个同辈元素,注意空格 var ...

  3. [时间操作] C#DateFormat时间帮助类 (转载)

    点击下载 DateFormat.rar 主要功能如下 返回每月的第一天和最后一天 看下面代码吧 /// <summary> /// 类说明:时间操作类 /// 编 码 人:苏飞 /// 联 ...

  4. [Session] SessionHelper2---C#关于Session高级操作帮助类 (转载)

    点击下载 SessionHelper2.rar 这个类是关于Session的一些高级操作1.添加时限制时间2.读取对象3.读取数据等等看下面代码吧 /// <summary> /// 联系 ...

  5. C#当中的多线程_任务并行库(下)

    4.8 处理任务中的异常 下面这个例子讨论了任务当中抛出异常,以及任务异常的获取     class Program     {         static void Main(string[] a ...

  6. Java23种设计模式之单例模式

    一.单例模式简介 单例模式是Java设计模式中常见的一种模式.主要分为懒汉式单例.饿汉式单例.登记式单例: 单例模式的特点:  1.单例类只能有一个实例:  2.单例类必须自己创建自己的唯一的实例: ...

  7. storm简介[ZZ]

    场景 伴随着信息科技日新月异的发展,信息呈现出爆发式的膨胀,人们获取信息的途径也更加多样.更加便捷,同时对于信息的时效性要求也越来越高.举个搜索 场景中的例子,当一个卖家发布了一条宝贝信息时,他希望的 ...

  8. 批量缩放PNG图片.

    最近需要缩放N多图片, 找遍了互联网也没有找到方便使用的批量缩放工具.. 趁着周末写一个练手.. #include <iostream> #include <vector> # ...

  9. 深入理解QStateMachine与QEventLoop事件循环的联系与区别

    最近一直在倒腾事件循环的东西,通过查看Qt源码多少还是有点心得体会,在这里记录下和大家分享.总之,对于QStateMachine状态机本身来说,需要有QEventLoop::exec()的驱动才能支持 ...

  10. Pintos-斯坦福大学操作系统Project详解-Project1

    转载请注明出处. 前言:  本实验来自斯坦福大学cs140课程,只限于教学用途,以下是他们对于Pintos系统的介绍:  Pintos is a simple operating system fra ...