- 浏览: 687172 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (254)
- java分布式应用架构 (22)
- SSH框架整合 (6)
- java web 学习笔记 (49)
- java 学习笔记 (56)
- struts 2 学习 (6)
- Hibernate学习 (10)
- spring 学习 (2)
- 客户端编程(javascript) (4)
- IDE使用 (13)
- 生命 人生 (6)
- 系统维护 (3)
- 技术篇 (10)
- MySql (2)
- J2ME (1)
- java网络编程 (4)
- 数据库 (5)
- C/C++ (8)
- Oracle (7)
- 软件测试 (0)
- 软件的安装和部署 (0)
- Java快讯 (1)
- swt (1)
- Flex (1)
- 软件工程 (1)
- PostgreSQL (1)
- sql server2000 (2)
- 嵌入式数据库sqlite (5)
- J2EE (1)
- XML (1)
- ibatis3(MyBatis) (6)
- Linux&Unix (1)
- velocity (1)
- 回报社会 (4)
- 软件项目管理 (3)
- android研究 (3)
- C# (2)
- Objective-C (1)
- 音乐 (0)
- webx (1)
- JMS (1)
- maven软件项目管理 (1)
- 分布式服务 (0)
- 云平台 (0)
- 分布式存储 (1)
- 分布式系统架构 (0)
- 移动互联网 (1)
- ZooKeeper (1)
最新评论
-
liyys:
楼主,可不可以发这个项目的源码工程出来分享一下,少了几个类。楼 ...
仿照Hibernate实现一个SQLite的ORM框架 -
liyys:
少了一些类的源码没有粘贴出来
仿照Hibernate实现一个SQLite的ORM框架 -
honglei0412:
我使用的是这种方式获取db文件的目录但是 URL p = Fi ...
使用sqlite注意事项 -
honglei0412:
大侠 能不能说明下DbFile您是怎么做的吗?
使用sqlite注意事项 -
ahack:
刚写完mapping才发现早就有人写好了。仔细一看还都是针对的 ...
仿照Hibernate实现一个SQLite的ORM框架
1、扩展velocity的视图
[code="java"]package org.christ.matrix.template.velocity;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.apache.velocity.Template;
import org.apache.velocity.context.Context;
import org.apache.velocity.tools.Scope;
import org.apache.velocity.tools.Toolbox;
import org.apache.velocity.tools.ToolboxFactory;
import org.apache.velocity.tools.config.XmlFactoryConfiguration;
import org.apache.velocity.tools.view.ViewToolContext;
import org.christ.matrix.template.TemplateVariable;
import org.springframework.util.CollectionUtils;
import org.springframework.web.context.support.ServletContextResource;
import org.springframework.web.servlet.view.velocity.VelocityToolboxView;
/**
* 扩展velocity的视图解析器。
*
* 自动匹配到Layout并扩展相关模板工具的Velocity视图。
*
* @author 刘飞 E-mail:liufei_it@126.com
* @version 1.0
* @since 2013-7-1 上午11:06:59
*/
public class VelocityTemplateLayoutView extends VelocityToolboxView implements DefaultVelocityConfigurer {
/** 模板文件的根路径目录 */
protected String templates = null;
/** screen模板解析的视图目录 */
protected String screen = null;
/** layout模板解析的视图目录 */
protected String layout = null;
/** velocity模板默认加载的layout模板 */
protected String defaultLayoutTemplate = null;
/** screen模板key */
protected String screenTemplateKey = null;
/** 本次请求对应的视图名称 */
protected String viewName = null;
/** 模板对应的扩展名称 */
protected String suffix = null;
protected List toolboxs = new ArrayList();
@Override
protected void doRender(Context context, HttpServletResponse response) throws Exception {
Template screenTemplate = getTemplate();
// 同名的layout
String layoutTemplateURL = SYSTEM_SEPARATOR + templates + SYSTEM_SEPARATOR + layout + SYSTEM_SEPARATOR
+ viewName + suffix;
Template layoutTemplate = safeLoadLayoutTemplate(layoutTemplateURL);
if (layoutTemplate == null) {// 默认的layout
layoutTemplateURL = SYSTEM_SEPARATOR + templates + SYSTEM_SEPARATOR + layout + SYSTEM_SEPARATOR
+ defaultLayoutTemplate;
layoutTemplate = safeLoadLayoutTemplate(layoutTemplateURL);
}
if (layoutTemplate == null) {// 没有找到layout就只解析screen
mergeTemplate(screenTemplate, context, response);
} else {
context.put(screenTemplateKey, templateRender(context, screenTemplate));
mergeTemplate(layoutTemplate, context, response);
}
}
@Override
protected Context createVelocityContext(Map model, HttpServletRequest request,
HttpServletResponse response) throws Exception {
ViewToolContext context = new ViewToolContext(getVelocityEngine(), request, response, getServletContext());
context.putAll(model);
if (!CollectionUtils.isEmpty(toolboxs)) {// 注入模板工具
for (Toolbox toolbox : toolboxs) {
context.addToolbox(toolbox);
}
}
Map templateVariables = getApplicationContext().getBeansWithAnnotation(TemplateVariable.class);
if (templateVariables != null && templateVariables.size() > 0) {
for (Map.Entry e : templateVariables.entrySet()) {// 注入自定义工具
context.put(e.getKey(), e.getValue());
}
}
Map controls = getApplicationContext().getBeansOfType(
VelocityTemplateController.class, true, false);
if (controls != null && controls.size() > 0) {// 注入control
for (Map.Entry e : controls.entrySet()) {
String name = e.getKey();
VelocityTemplateController controller = e.getValue();
controller.setContext(context);
controller.setVelocityEngine(getVelocityEngine());
context.put(name, controller);
}
}
return context;
}
/**
* 初始化工作。
*
* @throws Exception
*/
protected void init() throws Exception {
if (StringUtils.isBlank(templates)) {
templates = DEFAULT_TEMPLATES;
}
if (StringUtils.isBlank(screen)) {
screen = DEFAULT_SCREEN;
}
if (StringUtils.isBlank(layout)) {
layout = DEFAULT_LAYOUT;
}
if (StringUtils.isBlank(defaultLayoutTemplate)) {
defaultLayoutTemplate = DEFAULT_LAYOUT_TEMPLATE;
}
if (StringUtils.isBlank(suffix)) {
suffix = DEFAULT_SUFFIX;
}
if (StringUtils.isBlank(screenTemplateKey)) {
screenTemplateKey = DEFAULT_SCREEN_TEMPLATE_KEY;
}
if (StringUtils.isNotBlank(getToolboxConfigLocation())) {
// 扩展使用velocity tools 2.0
try {
XmlFactoryConfiguration configuration = new XmlFactoryConfiguration();
ServletContextResource resource = new ServletContextResource(getServletContext(),
getToolboxConfigLocation());
configuration.read(resource.getURL());
ToolboxFactory factory = configuration.createFactory();
if (factory.hasTools(Scope.APPLICATION)) {
Toolbox applicationTool = factory.createToolbox(Scope.APPLICATION);
if (applicationTool != null) {
toolboxs.add(applicationTool);
}
}
if (factory.hasTools(Scope.REQUEST)) {
Toolbox requestTool = factory.createToolbox(Scope.REQUEST);
if (requestTool != null) {
toolboxs.add(requestTool);
}
}
if (factory.hasTools(Scope.SESSION)) {
Toolbox sessionTool = factory.createToolbox(Scope.SESSION);
if (sessionTool != null) {
toolboxs.add(sessionTool);
}
}
} catch (Exception e) {
logger.error(String.format("init toolbox [%s] error.", getToolboxConfigLocation()), e);
}
}
}
/**
* 安全的校验并获取layout模板。
*
* @param layoutURL
* @return
*/
protected Template safeLoadLayoutTemplate(String layoutURL) {
try {
return getTemplate(layoutURL);
} catch (Exception e) {
if (logger.isDebugEnabled()) {
logger.debug("Loading Layout Template: " + layoutURL, e);
}
}
return null;
}
@Override
public final void afterPropertiesSet() throws Exception {
super.afterPropertiesSet();
try {
init();
} catch (Exception e) {
logger.error("VelocityTemplateLayoutView#init error.", e);
}
}
@Override
public boolean checkResource(Locale locale) throws Exception {
if (StringUtils.isBlank(templates)) {
if (logger.isErrorEnabled()) {
logger.error("Property 'templates' is required.");
}
throw new IllegalArgumentException("Property 'templates' is required.");
}
if (StringUtils.isBlank(screen)) {
if (logger.isErrorEnabled()) {
logger.error("Property 'screen' is required.");
}
throw new IllegalArgumentException("screen 'screen' is required.");
}
if (StringUtils.isBlank(layout)) {
if (logger.isErrorEnabled()) {
logger.error("Property 'layout' is required.");
}
throw new IllegalArgumentException("screen 'layout' is required.");
}
if (StringUtils.isBlank(defaultLayoutTemplate)) {
if (logger.isErrorEnabled()) {
logger.error("Property 'defaultLayoutTemplate' is required.");
}
throw new IllegalArgumentException("screen 'defaultLayoutTemplate' is required.");
}
if (StringUtils.isBlank(suffix)) {
if (logger.isErrorEnabled()) {
logger.error("Property 'suffix' is required.");
}
throw new IllegalArgumentException("screen 'suffix' is required.");
}
if (StringUtils.isBlank(screenTemplateKey)) {
if (logger.isErrorEnabled()) {
logger.error("Property 'screenTemplateKey' is required.");
}
throw new IllegalArgumentException("screen 'screenTemplateKey' is required.");
}
if (StringUtils.isBlank(viewName)) {
if (logger.isErrorEnabled()) {
logger.error("Property 'viewName' is required.");
}
throw new IllegalArgumentException("screen 'viewName' is required.");
}
return super.checkResource(locale);
}
/**
* 渲染一个模板。
*
* @param context
* @param template
* @return
*/
protected String templateRender(Context context, Template template) {
if (template == null || context == null) {
return null;
}
try {
StringWriter sw = new StringWriter();
template.merge(context, sw);
return sw.toString();
} catch (Exception e) {
logger.error(String.format("Template[%s] Render Error.", template.getName()), e);
}
return null;
}
/**
* @return the templates
*/
public String getTemplates() {
return templates;
}
/**
* @param templates
* the templates to set
*/
public void setTemplates(String templates) {
this.templates = templates;
}
/**
* @return the screen
*/
public String getScreen() {
return screen;
}
/**
* @param screen
* the screen to set
*/
public void setScreen(String screen) {
this.screen = screen;
}
/**
* @return the layout
*/
public String getLayout() {
return layout;
}
/**
* @param layout
* the layout to set
*/
public void setLayout(String layout) {
this.layout = layout;
}
/**
* @return the defaultLayoutTemplate
*/
public String getDefaultLayoutTemplate() {
return defaultLayoutTemplate;
}
/**
* @param defaultLayoutTemplate
* the defaultLayoutTemplate to set
*/
public void setDefaultLayoutTemplate(String defaultLayoutTemplate) {
this.defaultLayoutTemplate = defaultLayoutTemplate;
}
/**
* @return the viewName
*/
public String getViewName() {
return viewName;
}
/**
* @param viewName
* the viewName to set
*/
public void setViewName(String viewName) {
this.viewName = viewName;
}
/**
* @return the suffix
*/
public String getSuffix() {
return suffix;
}
/**
* @param suffix
* the suffix to set
*/
public void setSuffix(String suffix) {
this.suffix = suffix;
}
/**
* @return the screenTemplateKey
*/
public String getScreenTemplateKey() {
return screenTemplateKey;
}
/**
* @param screenTemplateKey
* the screenTemplateKey to set
*/
public void setScreenTemplateKey(String screenTemplateKey) {
this.screenTemplateKey = screenTemplateKey;
}
}
2、扩展velocity模板解析器来完成上述的规约配置。
[code="java"]/**
* E-Mail : liufei_it@126.com, liufeiit@gmail.com, wb-liufei@taobao.com
* QQ : 970275153
*/
package org.christ.matrix.template.velocity;
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.christ.matrix.template.TemplateViewResolver;
import org.springframework.beans.BeansException;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.core.io.ClassRelativeResourceLoader;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.ResourceLoader;
import org.springframework.web.context.support.ServletContextResourceLoader;
import org.springframework.web.servlet.view.AbstractUrlBasedView;
import org.springframework.web.servlet.view.velocity.VelocityViewResolver;
/**
* 模板视图布局规则:
*
* 指定模板文件的根路径目录,在该目录的子目录下指定一个目录作为screen模板解析的视图目录
*
* 在该目录的子目录下指定一个目录作为layout模板解析的视图目录
*
* 其余的子目录下的模板直接用其目录名称作为control对象直接引用即可。
*
* @author 刘飞 E-mail:liufei_it@126.com
* @version 1.0
* @since 2013-6-30 下午01:36:58
*/
public class VelocityTemplateLayoutViewResolver extends VelocityViewResolver implements TemplateViewResolver,
DefaultVelocityConfigurer {
/** 加载control模板文件的编码 */
protected String encoding = null;
/** 模板文件的根路径目录 */
protected String templates = null;
/** screen模板解析的视图目录 */
protected String screen = null;
/** layout模板解析的视图目录 */
protected String layout = null;
/** velocity模板默认加载的layout模板 */
protected String defaultLayoutTemplate = null;
/** screen模板key */
protected String screenTemplateKey = null;
/** 资源加载器。 */
protected ResourceLoader resourceLoader = new DefaultResourceLoader();
/** {@link #templates} 下的control目录 */
protected final List controls = new ArrayList();
/** velocity模板contentType */
protected String contentType = null;
/** 约定:模板缓存上限,为-1的时候表示关闭,不配置的话默认是2048 */
protected Integer cacheLimit = null;
@Override
protected Class> requiredViewClass() {
return VelocityTemplateLayoutView.class;
}
@Override
protected AbstractUrlBasedView buildView(String viewName) throws Exception {
VelocityTemplateLayoutView view = VelocityTemplateLayoutView.class.cast(super.buildView(viewName));
view.setCacheTemplate(true);
view.setContentType(contentType);
view.setTemplates(templates);
view.setScreen(screen);
view.setLayout(layout);
view.setEncoding(encoding);
view.setViewName(viewName);
view.setSuffix(getSuffix());
view.setScreenTemplateKey(screenTemplateKey);
view.setDefaultLayoutTemplate(defaultLayoutTemplate);
return view;
}
protected void controlBeanRegistry(BeanDefinitionRegistry registry) throws Exception {
if (controls == null || controls.isEmpty()) {
logger.debug("没有control需要配置.");
return;
}
for (File controlFile : controls) {
String absolutePath = controlFile.getAbsolutePath();
String name = controlFile.getName();
try {
RootBeanDefinition controlBean = getDefaultRootBeanDefinition(VelocityTemplateController.class,
"模板引擎扩展的control:" + name);
MutablePropertyValues propertyValues = new MutablePropertyValues();
propertyValues.addPropertyValue("encoding", encoding);
/** 将control的绝对路径赋予 */
propertyValues.addPropertyValue("control", SYSTEM_SEPARATOR + templates + SYSTEM_SEPARATOR + name
+ SYSTEM_SEPARATOR);
controlBean.setPropertyValues(propertyValues);
registry.registerBeanDefinition(name, controlBean);
logger.error(String.format("Registry control Named[%s] for template directory[%s] success.", name,
absolutePath));
} catch (Exception e) {
logger.error(String.format("Registry control Named[%s] for template directory[%s] error.", name,
absolutePath));
}
}
}
@Override
public void afterPropertiesSet() throws Exception {
if (StringUtils.isBlank(templates)) {
templates = DEFAULT_TEMPLATES;
}
if (StringUtils.isBlank(screen)) {
screen = DEFAULT_SCREEN;
}
if (StringUtils.isBlank(layout)) {
layout = DEFAULT_LAYOUT;
}
if (StringUtils.isBlank(encoding)) {
encoding = DEFAULT_ENCODING;
}
if (StringUtils.isBlank(defaultLayoutTemplate)) {
defaultLayoutTemplate = DEFAULT_LAYOUT_TEMPLATE;
}
if (StringUtils.isBlank(screenTemplateKey)) {
screenTemplateKey = DEFAULT_SCREEN_TEMPLATE_KEY;
}
if (StringUtils.isEmpty(contentType)) {
contentType = DEFAULT_CONTENT_TYPE;
}
if (StringUtils.isBlank(getSuffix())) {//默认配置
setSuffix(DEFAULT_SUFFIX);
}
setPrefix(SYSTEM_SEPARATOR + templates + SYSTEM_SEPARATOR + screen + SYSTEM_SEPARATOR);// 设置prefix
if (cacheLimit == null) {
cacheLimit = CACHE_LIMIT;
}
if(cacheLimit != null && cacheLimit > 0) {
setCacheLimit(cacheLimit);
setCache(true);
} else {
setCache(false);
}
try {
/** 模板根路径 */
File templates = getTemplatesSource(SYSTEM_SEPARATOR + this.templates + SYSTEM_SEPARATOR);
if (templates != null && templates.isDirectory()) {
/** 过滤根路径下的control目录 */
File[] controlTemplates = templates.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
if (StringUtils.equalsIgnoreCase(name, screen) || StringUtils.equalsIgnoreCase(name, layout)) {
return false;
}
return true;
}
});
if (ArrayUtils.isNotEmpty(controlTemplates)) {
controls.addAll(Arrays.asList(controlTemplates));
}
}
} catch (Exception e) {
logger.error("加载control异常", e);
}
}
/**
* 获取模板根路径文件。
*
* @param templates
* @return
*/
protected File getTemplatesSource(String templatesPath) {
File templates = null;
try {
templates = resourceLoader.getResource(templatesPath).getFile();
if(templates != null) {
return templates;
}
} catch (Exception e) {
logger.warn(String.format("[%s] trying loading resource [%s] failure.", resourceLoader.getClass().getSimpleName(), templatesPath), e);
}
try {
templates = new ServletContextResourceLoader(getServletContext()).getResource(templatesPath).getFile();
if(templates != null) {
return templates;
}
} catch (Exception e) {
logger.error(String.format("[%s] trying loading resource [%s] failure.", ServletContextResourceLoader.class.getSimpleName(), templatesPath), e);
}
try {
templates = new ClassRelativeResourceLoader(getClass()).getResource(templatesPath).getFile();
if(templates != null) {
return templates;
}
} catch (Exception e) {
logger.error(String.format("[%s] trying loading resource [%s] failure.", ClassRelativeResourceLoader.class.getSimpleName(), templatesPath), e);
}
logger.error(String.format("trying loading resource [%s] failure.", templatesPath));
return null;
}
/**
* 在这里将注入和各个目录对应的control
*/
@Override
public final void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
try {
if (beanFactory instanceof BeanDefinitionRegistry) {
controlBeanRegistry(BeanDefinitionRegistry.class.cast(beanFactory));
} else {
logger.warn("ConfigurableListableBeanFactory can't be cast to BeanDefinitionRegistry.");
}
postProcessBeanFactory0(beanFactory);
} catch (Exception e) {
logger.error("注入和各个目录对应的control异常", e);
}
}
/**
* 基础的RootBeanDefinition定义。
*
* @param clazz
* @param description
* @return
*/
protected RootBeanDefinition getDefaultRootBeanDefinition(Class> clazz, String description) {
RootBeanDefinition beanDefinition = new RootBeanDefinition(clazz);
beanDefinition.setAbstract(false);
beanDefinition.setAutowireCandidate(true);
beanDefinition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);
beanDefinition.setDependencyCheck(AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);
beanDefinition.setDescription(description);
beanDefinition.setLazyInit(false);
beanDefinition.setScope(AbstractBeanDefinition.SCOPE_SINGLETON);
return beanDefinition;
}
protected void postProcessBeanFactory0(ConfigurableListableBeanFactory beanFactory) throws Exception {
}
@Override
public void setTemplates(String templates) {
this.templates = templates;
}
@Override
public void setScreen(String screen) {
this.screen = screen;
}
@Override
public void setLayout(String layout) {
this.layout = layout;
}
/**
* @param resourceLoader
* the resourceLoader to set
*/
public void setResourceLoader(ResourceLoader resourceLoader) {
this.resourceLoader = resourceLoader;
}
/**
* @param encoding
* the encoding to set
*/
public void setEncoding(String encoding) {
this.encoding = encoding;
}
/**
* @return the defaultLayoutTemplate
*/
public String getDefaultLayoutTemplate() {
return defaultLayoutTemplate;
}
/**
* @param defaultLayoutTemplate
* the defaultLayoutTemplate to set
*/
public void setDefaultLayoutTemplate(String defaultLayoutTemplate) {
this.defaultLayoutTemplate = defaultLayoutTemplate;
}
/**
* @return the screenTemplateKey
*/
public String getScreenTemplateKey() {
return screenTemplateKey;
}
/**
* @param screenTemplateKey
* the screenTemplateKey to set
*/
public void setScreenTemplateKey(String screenTemplateKey) {
this.screenTemplateKey = screenTemplateKey;
}
/**
* @return the encoding
*/
public String getEncoding() {
return encoding;
}
/**
* @return the templates
*/
public String getTemplates() {
return templates;
}
/**
* @return the screen
*/
public String getScreen() {
return screen;
}
/**
* @return the layout
*/
public String getLayout() {
return layout;
}
/**
* @return the resourceLoader
*/
public ResourceLoader getResourceLoader() {
return resourceLoader;
}
}
重新定义的解析器接口
[code="java"]/**
* E-Mail : liufei_it@126.com, liufeiit@gmail.com, wb-liufei@taobao.com
* QQ : 970275153
*/
package org.christ.matrix.template;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
/**
* 模板视图布局规则:
*
* 指定模板文件的根路径目录,在该目录的子目录下指定一个目录作为screen模板解析的视图目录
*
* 在该目录的子目录下指定一个目录作为layout模板解析的视图目录
*
* 其余的子目录下的模板直接用其目录名称作为control对象直接引用即可。
*
* @author 刘飞 E-mail:liufei_it@126.com
* @version 1.0
* @since 2013-6-30 上午11:58:41
*/
public interface TemplateViewResolver extends BeanFactoryPostProcessor, InitializingBean {
/**
* 指定模板文件的根路径目录.
*
* @param templates
*/
void setTemplates(String templates);
/**
* 指定{@link #setTemplate(String)}一个目录作为screen模板解析的视图目录.
*
* @param screen
*/
void setScreen(String screen);
/**
* 指定{@link #setTemplate(String)}一个目录作为layout模板解析的视图目录
*
* @param layout
*/
void setLayout(String layout);
}
发表评论
-
【分布式系统工程实现】CAP理论及系统一致性
2013-03-08 16:05 1040印象中CAP理论开始流行 ... -
【分布式系统工程实现】分布式事务
2013-03-08 16:03 1392CAP理论虽然告诉我们,一致性和可用性二者不可兼得,但这并不 ... -
用消息队列和消息应用状态表来消除分布式事务
2013-03-08 16:01 1278由于数据量的巨大,大 ... -
使用MBean获取tomcat和jboss端口
2012-04-10 21:29 2679/** * 根据协议和scheme获取服务端口号 ... -
淘宝网架构概述
2011-12-14 19:45 72众所周知,淘宝网是一 ... -
淘宝网的HttpClient工具
2011-11-23 21:02 47package com.taobao.pegasus.comm ... -
在Tomcat中通过JOTM支持JTA
2011-11-04 15:57 1868<?xml version='1.0' encoding ... -
sql server2005备份还原
2011-09-22 11:29 9751、先建立一个同名数据库,停止SQL SERVER2005 ... -
apache mina开发文件传输服务器
2011-09-19 18:03 7741服务器接收端 /** * */ package o ... -
使用 Apache MINA 2 开发网络应用
2011-09-19 10:01 1174简介: Apache MINA 2 是一个开发高性能和高可伸缩 ... -
HTTP上传工具
2011-09-14 11:36 1871package com.dayo.tool; impor ... -
定义一个java类型转换器
2011-09-09 19:48 13661、相关接口 package org.liufei.jweb. ... -
Java获取客户端信息
2011-09-07 14:48 1656String agent = request.getHeade ... -
使用mina 作代理服务器例子
2011-09-07 14:38 2372import java.net.InetSocketAddre ... -
Java 通过 HTTP 下载文件
2011-09-07 14:35 1083package core.spider; import ... -
Java 的 HTTP 客户端 http4j 示例代码
2011-09-07 14:32 1474package com.google.code.http4j. ... -
获取IP地址
2011-09-07 13:41 2431public String getIpAddrByReques ... -
netty telnet 应用实例server代码
2011-09-07 12:21 1897public class TelnetServer { ... -
Netty中使用Apache Common FileUpload
2011-09-07 12:19 1288/** * 用Netty来实现上传 */ publi ... -
netty实现Socket NIO服务器
2011-09-06 15:58 8807package org.liufei.dccserver; ...
相关推荐
本示例提供了一个基于Maven、Spring MVC、Mybatis和Velocity的整合实例,旨在帮助开发者理解并掌握这四大技术栈的协同工作方式。这四个组件在Java Web开发中扮演着至关重要的角色: 1. Maven:Maven是一款项目管理...
Spring MVC可以轻松地与各种模板引擎(如Thymeleaf、FreeMarker、Velocity等)集成,用于动态生成HTML或其他类型的文档。 以上就是Spring MVC4的一些核心知识点,通过深入学习和实践,开发者可以更好地利用这个...
Spring MVC 是一个轻量级的、基于Java的Web应用...总的来说,Spring MVC以其灵活性、可扩展性和易用性,成为了Java Web开发中的首选框架。通过理解并熟练掌握上述知识点,开发者可以有效地构建高效、可维护的Web应用。
Spring MVC不仅能够独立工作,还能轻松与其他流行Web框架如Struts、WebWork、JavaServer Faces和Tapestry集成,提供更加灵活的开发选择。 【请求处理生命周期】 Spring MVC的请求处理流程始于客户端发送HTTP请求到...
在这个"struts2+spring+velocity扩展实例V1版本"中,我们可以看到这三个框架的集成与应用。 首先,Struts2是一个基于MVC(Model-View-Controller)设计模式的Java Web框架,它的主要职责是处理用户的请求,并将其...
【Spring MVC 概述】 ... 在 Spring MVC 中集成 Velocity,我们需要配置 Velocity 视图解析器。首先,添加 Velocity 相关的依赖到项目中,然后在 Spring 配置文件中定义 Velocity 视图解析器: ```xml ...
Spring MVC 是一个基于Java的轻量级Web...同时,Spring MVC还与其他Spring组件(如Spring Data、Spring Security等)无缝集成,提供了丰富的功能扩展。因此,掌握Spring MVC对于Java Web开发者来说是必备的技能之一。
7. **AOP(Aspect-Oriented Programming)**:Spring MVC还可以与Spring的面向切面编程集成,用于日志记录、事务管理等横切关注点。 在文件`spring_mvc环境搭建.doc`中,可能详细介绍了如何配置Spring MVC的环境,...
6. **易于与其他View框架集成**:Spring MVC可以无缝地与各种视图框架集成,如Tiles和Velocity,提供更丰富的表现层选项。 7. **依赖注入(DI)**:Spring MVC基于Spring框架,可以利用Spring的依赖注入特性,使得...
1. **Spring Bean 管理**:Spring MVC 可以无缝集成 Spring IoC 容器,利用依赖注入管理 Controller 和其他服务类。 2. **数据绑定**:支持自动将请求参数绑定到 Controller 方法的参数上,反之亦然,便于处理表单...
此外,模型(MVC中的M)是一个Map接口,可以与各种视图技术(如JSP、Velocity、Freemarker)无缝集成,无需关心具体视图的实现细节。 视图解析在Spring MVC中也相当灵活,视图的选择可以通过文件扩展名、Accept头...
Spring MVC还实现了模型、视图和控制器之间的明确分离,这让每个组件都可以独立于其他组件进行定制和扩展,增强了系统的整体可维护性和可测试性。 #### 二、常见MVC框架比较 在运行性能方面,JSP+Servlet组合的...
6. **支持多种视图技术**:Spring MVC可以很好地集成各种视图技术,如JSP、Velocity、Freemarker、Thymeleaf等。 三、配置Spring MVC 1. **引入依赖**:在项目中添加Spring MVC的相关jar包,如`spring-webmvc`和`...
同时,Spring Web MVC支持灵活的URL映射策略,能够非常方便地与其他视图技术(如Velocity、FreeMarker等)集成。此外,它还提供了一系列内置的功能,如数据类型转换器、数据格式化器、数据验证器等,极大地简化了...
《Spring 3.0、Spring MVC 3.0与MyBatis 3.0整合详解》 在现代Java企业级应用开发中,Spring框架因其强大的功能和灵活性而被广泛使用。Spring 3.0作为其重要的一个版本,引入了诸多改进和新特性,提升了开发效率和...
通过上述配置和理解,你可以创建一个基本的Spring MVC项目,并逐步扩展以适应复杂的Web应用需求。在实际开发中,还会涉及视图层的模板引擎、数据访问层的ORM框架集成(如Hibernate)、事务管理、国际化、安全性等多...
6. **MVC集成**: 在Spring MVC中,`VelocityViewResolver`用于解析视图名,将请求映射到对应的Velocity模板,并结合ModelAndView对象填充模板内容。 7. **单元测试与集成测试**: 可能包含针对Spring与Velocity集成...