用 JAX-RS 和 JSR 371 规范设计一个 MVC 框架(二)HelloWorld

先说说用法,也就是 Hello World 了。

配置

引入 JAR 包

哪怕是 Hello World,也离不开前期的配置。首先把 JAX-RS JAR 引入你的 claspath。

  • javax.ws.rs-api-2.0.rev.A.jar

然后还要把 jar 加入 Eclipse 的 Deployment Assembly,不然 Tomcat 会告诉你找不到类。

配置 web.xml

如下,我们加入了全局的过滤器。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>ajaxjs-web</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>

    <filter>
        <description>MVC 过滤器</description>
        <filter-name>MVC_GlobalFilter</filter-name>
        <filter-class>com.ajaxjs.mvc.controller.MvcDispatcher</filter-class>

        <init-param>
            <description>指定搜索的包名,多个可以用 逗号 分开</description>
            <param-name>controller</param-name>
            <param-value>test.com.ajaxjs.mvc.controller</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>MVC_GlobalFilter</filter-name>
        <!--“/*”表示拦截所有的请求 -->
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

控制台显示如下图所示,告诉你扫描了哪些类。

要注意的是,扫描的不是类名,而是包名。多个包的话可用逗号分开。
包名应该是包含控制器 IController 的包,例如 test.com.ajaxjs.mvc.controller 包下面有个 SimpleController 类:
package test.com.ajaxjs.mvc.controller;

import javax.mvc.annotation.Controller;
import javax.ws.rs.GET;
import javax.ws.rs.Path;

import com.ajaxjs.mvc.controller.IController;

@Controller
@Path("/simple")
public class SimpleController implements IController {
    @GET
    public String showHTML() {
        return "html::Hello World!";
    }
}

这是一个十分简单的类是吧?好~。只要我们实现了 IController 接口,然后定义 @Controller 和 @Path 注解,指明一下 URL 是什么(当前是 /simple),就定义了一个控制器类——这个类能被扫描并分发为,只要用户访问 /simple 这个路径,即可执行这个类身上的方法!怎么执行呢?执行哪些方法呢?上述例子代码给出了最简单的一个 Get 方法,意思是 GET 请求到 /simple 这个路径上马上执行 showHTML() 这个方法——这个方法干什么呢?就是输出一段 HTML,请注意字符串里面的 html::XXXX 前缀是约定好的,表示 response 要输出的 HTML 字符串。如下图所示。

没错,符合了我们的预期。实际 html:: 的作用是将必须的 HTML 标签“环绕”了你想输出的任意字符串,好比说上面的 HTML 是:

<html><meta charset="utf-8" /><body>Hello World!</body></html>

到目前为止,还是不错的是吧?实际上我们的 MVC 还有个小问题。大家注意到没有, web.xml 的过滤器是全局路径的,即 “/*” 表示所有请求都会来到我 MVC 分发器这里。那么问题来了,如果碰到 js/css/html 等静态文件其实无须走我 MVC 这里,怎么处理?可以在 filter 里面“旁路”的,但“旁路”十分不方便。这里为大家介绍一个小技巧,就是为全局路径加上一个后缀的约定,即:

<filter-mapping>
    <filter-name>MVC_GlobalFilter</filter-name>
    <!--“/*”表示拦截所有的请求 -->
    <url-pattern>*.do</url-pattern>
</filter-mapping>

那么其他不是 do 后缀的都不走 MVC,——凡是 xx.do 的则走 MVC,如 http://localhost:8080/ajaxjs-web/simple/do.do
当然,如果你的 MVC 只是 RESTful 这样的接口的话,是不需要考虑这问题。

时间: 2024-08-03 12:39:59

用 JAX-RS 和 JSR 371 规范设计一个 MVC 框架(二)HelloWorld的相关文章

用 JAX-RS 和 JSR 371 规范设计一个 MVC 框架(一)开篇

最近做几个项目都是 SSM 的,也就是 Spring MVC + MyBatis.Spring MVC 不是说不好,而是覺得整个 Spring 框架太重了,而且受框架限制遇到一些小 case 也不好处理(想着这么顺应或"突破"框架的限制,--有时"原生的"反而好写出来),因此从这一点认知出发,最后决定自己写一个 MVC 框架!而设计的目标就是--提供一个最简单最小巧的 MVC 框架,花哨的功能一个不要,越简洁越好.花了2天左右时间完成,目前运行良好. 话说大家熟悉的

使用Annotations设计一个MVC框架

设计 当设计一个应用程序时, 清晰的分离该程序的不同逻辑组件, 总是被证明是有益的. 同时也存在许多不同的模式来帮助开发者实现这个目标.其中最有名同时也最常用的自然是Model-View-Controller (MVC)了, 它能够将每个应用程序(或者应用程序的一部分)分成三个不同功能的组件,并且定义了把他们联结在一起的规则.Swing本身就是基于这个模式的,而且每个使用Struts,这个流行的开发Web应用框架的人也都了解隐藏在MVC后面的理论. 这篇文章介绍了怎么样通过使用annotatio

浅谈MVC框架中View层的优雅设计及实例

设计 在基于B/S的应用程序开发中,从基本的技术分工上来说就是两大块,一是软件显示界面,另一个是程序逻辑.在N年前的脚本语言时代,无论是asp.php还是jsp,我们基本是都是把这两者柔和在一起的.尽管我们想方设法做好很多函数或者包含文件来努力达到软件的复用,但仍然无法满足多变的用户需求,这主要是因为以前的纯脚本编码方式无法很好支持及应用面向对象(OO)领域中的强大功能. 在常见的B/S软件项目中,界面的设计包括html界面.Wap界面及其它由文本字符协议为基本表示的界面等.以我们接触最多的ht

设计REST风格的MVC框架

Java 开发者对 MVC 框架一定不陌生,从 Struts 到 WebWork,Java MVC 框 架层出不穷.我们已经习惯了处理 *.do 或 *.action 风格的 URL,为每一个 URL 编写一个控制器,并继承一个 Action 或者 Controller 接口.然而,流行 的 Web 趋势是使用更加简单,对用户和搜索引擎更加友好的 REST 风格的 URL .例如,来自豆瓣的一本书的链接是 http://www.douban.com/subject/2129650/,而非 htt

最应该尽快规范设计的元素:超级链接

链接是最应该尽快规范设计的元素,因为点击链接是互联网使用者最频繁的动作. 我们花了很多精力在对链接本身的展示上,比如现有的四个状态:常态.访问过.鼠标悬停.鼠标点击.但对于点击之后的结果,却缺乏"暗示". 所谓点击之后的结果,最常见的有三种:在新窗口(或新标签)打开新页面.在当前窗口打开新页面.Popup提示信息框. 其实,从视觉设计上把点击之后的结果"暗示"一下,比链接本身的展示还要重要. 不要以为网民都像你一样,知道用快捷键点击就能在新窗口打开,国内60%以上的

规范设计心得:用户是谁,需求又是什么?

后台系统采用一整套UI,为什么会形式各异?能统一并带来更好的体验吗?基于交互设计师自己的内心疑问,我们迫切的产出一套设计规范用于统一后台操作系统,利于用户使用习惯的培养和延续,降低学习成本,提高使用效率,有效提高开发效率,方便功能的优化扩展.基于现有的系统,我们抽丝剥茧,才有了如今的阶段性成果. 用户是谁?需求是什么?交互设计师对于一个项目最基本的了解就是源于这两个问题.我们做这次规范也是如此-- 你知,或者不知;规范就在那里;不悲不喜 用户是谁?我们的系统是给谁用的? 初期是给我们的小二,后期

ejb-请问基于Java EE的构件规范设计开发构件,指的是使用EJB框架开发构件吗?

问题描述 请问基于Java EE的构件规范设计开发构件,指的是使用EJB框架开发构件吗? 我现在要完成的任务是开发一个可重用构件,这个构件要实现的功能是系统中一个数据处理模块.要求在Java EE 支撑平台下开发.我现在不太能理解这个构件的开发过程.查了资料得知javabean和ejb都可以用Java语言开发组件.javabean比较简单是一般和JSP配合的,开发比较小型的组件使用的.EJB更为复杂功能也全面,但是我的这个系统不是分布式的,也不需要与服务器进行交互.用EJB开发是不是有些不机智?

java-JAVA实体类怎么设计,不用框架

问题描述 JAVA实体类怎么设计,不用框架 现有三个表: A表:字段有user_id(主键), userName; B表:字段有commodity_id(主键), user_id(外键:A.user_id), commodity_name; C表:字段有sku_id(主键), commodity_id(外键:B.commodity_id), sku_code; 关系:A,B:一对多,B,C:一对多 现在我要查询数据,查询语句是: select A.*, B.*, C.* from A A lef

如何设计一个好的Windows 8应用

虽然 Windows 8 刚上市只有半个月多一点,但 Windows 8 之父,同时也是 Windows 和 Windows Live 部门的总裁.微软下一代 CEO 热门人选的史蒂芬・辛诺夫斯基却已经离开了微软, Windows 8 的设计语言名称也从最初的 Metro 先是变为 Modern 接着变为 Windows 8 Style,最后变为目前微软中国官方所称的 Microsoft Design(本文依旧延用旧名称 Metro 表示 Microsoft Design Language/St