老杨说话的地方
  • 首页
  • 关于老杨
  • 博客时间
  • 文章分类
    • 人生感悟
    • 信息技术
    • 往事随风
    • 情感随笔
    • 文学创作
    • 生活记录
    • 评论杂谈
    • 人工智能
  • 留言本
我是老杨
张驰有度 宠辱不惊
  1. 首页
  2. 信息技术
  3. 网上办公系统
  4. 正文

MVC的核心控制器

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

其实控制器编写出来之后就很简单了。因为控制器其实没有具体的功能,只是将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 控制器 框架
最后更新:2008年12月31日

老杨

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

点赞
< 上一篇
guest
guest
2 评论
内联反馈
查看所有评论
姜少雷
姜少雷
游客
2010年1月31日 下午2:04

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

0
回复
老杨
老杨
作者
回复给  姜少雷
2010年1月31日 下午2:05

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

0
回复

老杨

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

搜索
最新 热点 随机
最新 热点 随机
git pull的时候报错Your local changes to the following files would be overwritten by merge LaTex中的下划线 Debian11使用su命令后command not found问题解决方法 Debian在使用apt安装软件时提示package has no installation candidate Debian11终端乱码问题解决 Debian的vi编辑器无法输入正常的字符 又到一年高考季 WordPress升级PHP8以后出现的警告 宝塔面板安装imagemagick报错 平行世界
又到一年高考季平行世界宝塔面板安装imagemagick报错WordPress升级PHP8以后出现的警告Debian的vi编辑器无法输入正常的字符Debian11终端乱码问题解决LaTex中的下划线Debian在使用apt安装软件时提示package has no installation candidateDebian11使用su命令后command not found问题解决方法git pull的时候报错Your local changes to the following files would be overwritten by merge
C#中得到文件夹下文件 打折感恩节 晴迷星途22阶段胜利 在Java和JSP中使用Jdom读取XML 使用Servlet过滤器实现用户登录验证 雨 莫谈国事 晴迷星途15文总的目标 使用wordpress的ping功能 IE6以及一个奇怪的问题
最新评论
  • 又到一年高考季上的老杨就是这个道理啊。
  • WordPress主题发布:kratos_Yang上的老杨嗯,那可以。
  • 又到一年高考季上的xqiushi我没有看到后来犹太裔的相关报告了。如果犹太裔也能搞到大资本,肯定还是有…
  • WordPress主题发布:kratos_Yang上的xqiushi对,没法互动。我就是随便玩玩,不考虑稳定性。
  • 又到一年高考季上的老杨那么现在犹太人,难道就不会拿大头了?我感觉犹太人在资源方面,也挺厉害的…
  • WordPress主题发布:kratos_Yang上的老杨github还是不稳定啊。 对于网站来说,没有什么比稳定更重要。
  • WordPress主题发布:kratos_Yang上的老杨哦,我明白你的意思了。就是说全部用静态网页?那没办法互动吧。哦,也行,…
  • LaTex中设置字体的正确方法上的老杨对,需求不同,用到的技术和工具也不同。
  • 更新Gitlab时遇到错误The following signatures were invalid上的老杨不是,这个是我用Gitlab这个软件,自己搭建的git服务器。
  • 又到一年高考季上的xqiushi黄庭康老师的书上大概是这个意思,只要唯分数论,犹太裔绝对拿大头。

Google java jsp linux QQ wordpress 中国 习惯 人生 公司 决定 博士 博客 同学 国家 大学 学习 实验室 家 小说 工作 开始 思考 情感 手机 技术 推荐 插件 数据库 文件 晴迷星途 朋友 生活 电影 相声 程序 笔记 网站 网络 置顶 美国 评论 软件 音乐 项目

关注公众号
广告

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

THEME KRATOS YANG Modified BY 老杨

鲁ICP备17014997号-4

鲁公网安备 37021302000754号