老杨说话的地方
  • 首页
  • 关于老杨
  • 博客时间
  • 文章分类
    • 人工智能
    • 人生感悟
      • 共产主义
      • 能量哲学
      • 自然辩证法
    • 信息技术
      • C#笔记
      • LaTex
      • Linux
      • RIME
      • Ubuntu&Debian
      • WordPress
      • 基于Java的B/S系统构建
      • 开源开发
      • 病毒相关
      • 编程的坏习惯
      • 网上办公系统
    • 往事随风
      • 我在大学那几年
      • 童年趣事
      • 精彩生活
    • 情感随笔
    • 文学创作
      • 小说
    • 生活记录
      • 博士进行中
      • 美国一年
      • 老杨学游泳
    • 评论杂谈
  • 留言本
我是老杨
张驰有度 宠辱不惊
  1. 首页
  2. 信息技术
  3. 网上办公系统
  4. 正文

MVC的核心控制器

2008年12月31日 5824点热度 0人点赞 2条评论

MVC的核心控制器

其实控制器编写出来之后就很简单了。因为控制器其实没有具体的功能,只是将request中的数据提交给相应的模块进行处理。当然大型的项目可以有很多控制器,组成一个控制层,但是中央控制器只有一个。我这个框架比较简单,只有一个核心控制器。

这里是代码:

package beans.common;

import java.io.IOException;
import javax.servlet.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import java.lang.reflect.Field;
import java.io.*;
import beans.action.*;
import java.lang.reflect.*;
/**
*
* @author Semor
*
*/
public class Controller extends HttpServlet {
    private static final long serialVersionUID = 1L;   
      
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Controller() {       
        super();
        //
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doPost(request,response);
    }
    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        try{           
            String configfile=this.getInitParameter("config");                   
            String req_uri=request.getRequestURI();           
            String ctxPath = request.getContextPath();
            String uri = req_uri.substring(ctxPath.length()+1);
            DocumentBuilderFactory Factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder Builder = Factory.newDocumentBuilder();
            InputStream   is=getClass().getResourceAsStream(configfile);
            Document doc=Builder.parse(is);
            doc.normalize();
            Element action = doc.getElementById(uri);           
            if(action==null)
            {               
                System.out.println("Action Not Found,Please Check Your Config File!");
                response.setContentType("text/html");
                response.setCharacterEncoding("utf-8");
                PrintWriter pw=response.getWriter();
                pw.print("Server Error!Please Visit Later");   
               
            }else{               
                Object obj=setProperty(action.getAttribute("formbean"),request);
                request.setAttribute("formbean", obj);
                Class actionbean=Class.forName(action.getAttribute("class"));
                Action ActionToExe=(Action)actionbean.newInstance();
                if(ActionToExe.execute(request,response))
                {
                    response.sendRedirect(action.getAttribute("forward")); 
                }else{
                    RequestDispatcher   dispatcher   =   request.getRequestDispatcher(action.getAttribute("errorpage"));                                      
                    dispatcher.forward(request,response);  
                }
            }
        }catch(Exception e)
        {
            e.printStackTrace();
        }
    }
    public Object setProperty(String ClassPath,HttpServletRequest req)
    {
        try{
            Class ClassName=Class.forName(ClassPath);
            Object ClassInstance=ClassName.newInstance();
            Method[] MethToExe=ClassName.getDeclaredMethods();
            for(int i=0;i<MethToExe.length;i++)
            {                               
                String MethName=MethToExe[i].getName();
                if(MethName.substring(0, 3).equals("set"))
                {                           
                    String Parameter=req.getParameter(MethName.substring(3));
                    if(Parameter==null||Parameter.trim().equals(""))
                    {
                        continue;
                    }else{
                        Object arglist[] = new Object[1];
                        arglist[0] = new String(Parameter);                       
                        MethToExe[i].invoke(ClassInstance, arglist);
                    }
                }
            }
            return ClassInstance;
        }catch(Exception e)
        {
            e.printStackTrace();
        }
        return null;       
    }
}

代码比较简单,稍作解释:

1、doGet方法并没有具体的操作代码,而是提交给doPost来处理;

2、setProperty方法将request提交过来的数据封装到一个bean中,方法是调用的bean中的set函数,这种方式可能并不一定好,但是我现在没有找到更好的方式;

3、主函数首先从初始参数中得到配置文件的地址,然后读取配置文件,从配置文件中得到符合当前请求的action,然后将formbean存放到request范围内,提交给处理bean;

4、其中最后跳转的方法用了两个,一个是forword,另外一个是sendRedirect,这是因为forword并没有重新生成request对象,这样的话可以从request中读出错误信息,sendRedirect的话request将不再是从前的那个request,相当于重新发送了请求,如果request中保存了什么信息,这里也将不再存在。

下面会贴出配置文件的代码。

标签: java servlet 控制器 框架
最后更新:2026年11月04日
老杨

老杨

博士,非博学之士;讲师,讲所学所知。糊涂半生,虚度半世,唯愿平淡快乐,度过此生。

点赞

评论(2)

写下你的评论
  1. 姜少雷
    姜少雷2010年01月31日 14:04

    能不能发布Java 访问修饰符和static、final等关键字的配合实用的文章。

    1. 老杨
      老杨作者2010年01月31日 14:05

      @姜少雷 什么意思?没听明白

发表评论

选择代码语言
选好后在光标处插入代码块,把示例文字换成你的代码即可。

老杨

老杨

博士,非博学之士;讲师,讲所学所知。糊涂半生,虚度半世,唯愿平淡快乐,度过此生。

搜索
最新 热点 随机
关于机器人的发展 遥遥领先 开源密码生成工具SimplePassword 痛苦根源 同步日历-我的第一款鸿蒙应用(鸿蒙CalDav客户端) 别成为AI的奴隶 给阿嬷的情书 信息焦虑综合症 PUA 人的悲喜并不相通
为多用户安装Anaconda及其使用方法WordPress主题发布:kratos_YangLaTex中上划线\overline和\bar的使用说明LaTex中设置字体的正确方法那一年,2009使用Windows7自带Windows Media Center播放RMVB影片幼儿园:回味童年童年趣事之气门芯这几天的事儿无插件实现WordPress留言本
Debian 11下升级Cuda与Nvidia显卡驱动 框架的初步定型 Eclipse导入Java项目的配置方法 网上购物 我的爱 凋零 信心和希望 什锦八宝饭 管理瓶颈 我们该做些什么
最近评论
  • 感谢支持。可以买个鸿蒙设备玩玩
    老杨·2 周前·同步日历-我的第一款鸿蒙应用(鸿蒙CalDav客户端)
  • 没有鸿蒙设备,吆喝一声支持老杨的产品
    乱云/Akay·2 周前·同步日历-我的第一款鸿蒙应用(鸿蒙CalDav客户端)
  • 先从减少手机使用时间开始。
    shanshan·1 月前·信息焦虑综合症
  • 所以必须得自己下定决心痛改前非,而不是跟自己讲条件。
    shanshan·1 月前·第二青春计划失败
  • 这种平台挺多的,但是应该没啥用,能有啥情绪价值比躺着刷手机更好呢?
    老杨·1 月前·第二青春计划失败
  • 已经遇到了,额外支付了170,托运登机行李,还不是托运行李。
    老杨·1 月前·春秋航空让人长见识
  • 那很好,恭喜你
    老杨·1 月前·PUA
  • 可以尝试改变。
    老杨·1 月前·信息焦虑综合症
  • 现在很多人离开AI已经不知道怎么工作了。
    老杨·1 月前·别成为AI的奴隶
  • 建议开发一个适合P人的工作生活计划平台,完不成没什么惩罚、但是完成了有大大的情绪…
    shanshan·1 月前·第二青春计划失败
  • 还有部分机型里20寸箱子应该上不了机,且没有免费行李托运额度。托运费超贵!
    shanshan·1 月前·春秋航空让人长见识
  • 这个世界精致利己主义者太多啦!
    shanshan·1 月前·人的悲喜并不相通
文章分类
选择分类
  • 人工智能13
  • 人生感悟121
    • 共产主义1
    • 能量哲学12
    • 自然辩证法12
  • 信息技术234
    • C#笔记6
    • LaTex12
    • Linux18
    • RIME4
    • Ubuntu&Debian21
    • WordPress1
    • 基于Java的B/S系统构建10
    • 开源开发2
    • 病毒相关3
    • 编程的坏习惯4
    • 网上办公系统9
  • 往事随风41
    • 我在大学那几年18
    • 童年趣事12
    • 精彩生活5
  • 情感随笔113
  • 文学创作69
    • 小说68
  • 生活记录220
    • 博士进行中6
    • 美国一年22
    • 老杨学游泳4
  • 评论杂谈169
关注公众号

COPYRIGHT © 2026 老杨说话的地方. ALL RIGHTS RESERVED.

THEME KRATOS YANG Modified BY 老杨

鲁ICP备17014997号-4

鲁公网安备 37021302000754号