Ruby on Rails有个设计思想是:用编码规定代替繁琐的配置文件。jvm平台已经有一些类似ror的实现,比如
grails:http://docs.codehaus.org/display/GRAILS/2006/03/29/Groovy+on+Rails+(Grails)+0.1+Released
虽然由于java自身的局限,它很难做出像ruby或者groovy那样动态语言那样随心所欲的动作,但是利用它的运行时反射、动态代理等特性来尽可能体现“用编码规定代替繁琐的配置文件”这一思想。下面就转入正题。
ServletAPI对HTTP协议进行了封装,通过配置Web.xml来把不同的请求转发给不同的servlet来处理。Web框架则用一个ActionServlet,根据自己的对Action的定义来转发请求。
抛开那些繁琐的配置文件,设想一下这样一种方法:
1.Web动作的处理和响应
假设这样一个POST请求:
<
form
action
="logic/group/NewTopic"
method
="post"
>
Web动作实现Bean:
org.qqsns.web.logic.group.NewTopic
注意后面的logic/group/NewTopic和logic.group.NewTopic, 动作类和Web动作是通过请求路径和包名相互关联。
这样,对Web动作的响应就依赖于编译期的代码的组织结构而不是执行期的配置文件。这样的好处是避免了维护繁琐的配置文件,特别是在没有IDE支持的情况下。
org.qqsns.web.logic.group.NewTopic类是一个实现net.wff.servlet.WebAction接口的POJO,下面是NewTopic中execute的方法片段:
//
Only method must be implemented for interface net.wff.servlet.WebAction
public
String execute(HttpServletRequest request, HttpServletResponse response)
throws
ServletException, IOException
{
//
return "redirect /success.html";
//
请求重定向
return
"
/success.jsp
"
;
//
请求转发
}
execute方法的返回值手动指定了一个转发或重定向的路径。
2.输入验证
普通的Web框架都带数据输入验证功能,一般复杂程度和功能强大与否成正比。
这里简单地要求从setter方法里抛出一个包含验证信息的异常,以此来实现输入异常处理。
普通setter方法
public
void
setName(String name)
{
this
.name
=
name;
}
添加输入验证后的setter方法
public
void
setName(String name)
throws
InputException
{
if
(name.length()
<
3
)
throw
new
InputException(
"
Topic name must has a length greater than 3
"
);
this
.name
=
name;
}
WaterFallServlet是如何处理验证信息的:
WebAction wa
=
(WebAction)Class.forName(classPath).newInstance();
//
procces forwarding
try
{
ActionHelper.setProperties(request,wa);
}
catch
(InputException e)
{
//
return to input view
//
header:referer
String rtn
=
request.getHeader(
"
referer
"
);
//
clear old errors
if
(rtn.indexOf(
"
?
"
)
!=
1
)
{
rtn
=
rtn.substring(
0
,rtn.indexOf(
"
?
"
));
}
rtn
=
rtn
+
"
?error=
"
+
URLEncoder.encode(e.getMessage(),
"
UTF-8
"
);
response.sendRedirect(rtn);
return
;
}
这样验证信息通过请求参数传回到输入页面.
3.数据绑定
假设有这样的html输入:
<
input
type
="text"
name
="name"
/>
<
input
type
="text"
name
="number"
/>
<
input
type
="text"
name
="price"
/>
下面是NewTopic中execute的方法全部:
public
String execute(HttpServletRequest request, HttpServletResponse response)
throws
ServletException, IOException
{
System.out.println(getName());
System.out.println(getNumber());
System.out.println(getPrice());
System.out.println(getLength());
return
"
/success.html
"
;
}
自动从request注入parameter,这也许是很多人喜欢Struts DynamicActionForm的原因之一。
不过这里实现更类似多了类型转换的<jsp:setProperty name="bean" property="*"/>
因为Name的类型是String,Number的类型是Integer,Price的类型是float,length的类型是double.至于其他复杂的类型,也许jsf的转换器是个更好的主意。
这样就初步解决了数据的输入绑定和验证。余下的就是业务逻辑的问题。WaterfallWebFramework源代码:
http://www.blogjava.net/Files/zqc/WaterfallWebFramework.rar (只有一个配置文件,其中只有1行配置信息!)
以上就是框架的主要功能。用编码规定代替配置文件,也许这会是一种更加高效率的开发方式。
分享到:
相关推荐
- **通过注解实现action的零配置**:使用注解代替XML配置文件。 #### 三、Struts2深入 ##### 1. 数据类型转换器 - **默认转换器**:Struts2提供了默认的数据类型转换器。 - **自定义转换器**:可以通过实现...
**3.2 Go 搭建一个简单的 Web 服务** - **标准库支持**:`net/http` 包的功能介绍。 - **路由分发**:处理不同 URL 路径的方法。 - **中间件**:添加功能或逻辑处理的常用模式。 **3.3 Go 如何使得 Web 工作** - ...
- **Action配置**:每个Action都有一个唯一的名称,通过配置文件中的`<action>`元素定义。例如: ```xml <result name="success">/WEB-INF/views/helloWorld.jsp ``` - **拦截器配置**:拦截器通过`...
- **无需XML配置**:使用注解和Java配置类代替XML配置文件。 综上所述,通过这些知识点的学习和理解,开发者能够全面掌握Spring框架的核心概念和技术要点,为后续的实际项目开发打下坚实的基础。
Struts是一个基于MVC模式的开源Web框架,用于构建动态网页应用。它通过将模型(Model)、视图(View)和控制器(Controller)分离来简化应用结构,提高可维护性和可扩展性。在Struts中,用户请求由控制器(Action...
6. **源码分析**:通过分析这个源码,学习者可以深入理解SSM框架的工作原理,例如Controller如何处理请求,Service如何调用DAO进行数据库操作,以及配置文件的设置等。此外,还可以学习到如何设计和组织项目结构,...
基于SSH框架的电影订票系统是一个典型的Java Web项目,涉及到前后端交互、数据库操作、用户认证、支付接口等多个环节。通过熟练掌握SSH框架,可以有效地提高开发效率,同时保证系统的稳定性和可扩展性。在实现过程中...
- **Profile特定配置文件**:指导如何为不同profile使用不同的配置文件。 - **日志**: - **日志格式**:解释了日志消息的格式规范。 - **控制台输出**:介绍了如何配置日志输出至控制台。 - **文件输出**:...
AForge.NET是一个开源的C#框架,它提供了丰富的图像处理和计算机视觉算法,包括视频流的捕获、分析和传输。本文将深入探讨如何利用AForge插件实现标题和描述中提到的功能,即视频流传输、投屏、拍照、录像以及屏幕...
- MyBatis是一个优秀的持久层框架,它支持SQL查询语句的编写,并通过注解或XML配置文件来实现对象关系映射。与Hibernate相比,MyBatis更灵活,但需要更多的手动编码。 42. **MyBatis的核心组件** - MyBatis的核心...
- **Profile-specific配置文件**:讨论如何使用特定于profile的配置文件。 #### 十一、日志 - **日志格式**:介绍Spring Boot支持的日志格式。 - **控制台输出**: - **Color-coded输出**:解释如何启用颜色编码...
- **简介**:这部分内容为开发者提供了快速入门指南,帮助新用户理解如何启动一个基于 Spring 的项目。 - **目标读者**:面向希望了解如何快速设置 Spring 应用程序的新手。 **2. Spring 框架介绍** - **依赖注入...
Struts2是一个灵活且功能强大的Web框架,它具有以下特性: - **拦截器机制**:通过自定义拦截器可以对Action执行前后进行干预,例如权限验证、日志记录等功能。 - **国际化支持**:内置资源文件管理器,方便实现多...