在ServiceView-servlet.xml我们使用两种两种映射方式SimpleUrlHandlerMapping和BeanNameUrlHandlerMapping,JasperReports和Velocity采用SimpleUrlHandlerMapping,而xml-rpc采用BeanNameUrlHandlerMapping,所以我们在xml-rpc的Controller声明之前要声明BeanNameUrlHandlerMapping,保证BeanNameUrlHandlerMapping的实现。在xml-rpc的Controller声明中,我们声明的id是依据上下文(Context)进行的,如”/service1”,那么在调用时应包含servlet映射中加上前缀:xml-rpc,结果如下:http://localhost:port/webappname/xml-rpc/service1,这些你得注意一下。在文件中,我们利用到DataSource和VelocityEngine,这些信息在另一个Spring文件中申明。代码如下:
<!-- setting VelocityEngine-->
<bean id="VelocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
<property name="resourceLoaderPath">
<value>file:/e:/source/intellij/power_acl</value>
</property>
</bean>
<!-- setting database source-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/power_acl?autoReconnect=true</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>abc123</value>
</property>
</bean>
VelocityEngine的申明应当包含resourceLoaderPath,这样才能保证模板的成功加载。
我们已经将所有的配置设置好啦,下面我们要进行代码编写啦。通过Spring的IoC机制,你将发现代码编写容易多啦,这样犯错误的机会就少啦。
ViewVelocityTemplateController文件:
package com.jetmaven.oa;
import org.apache.velocity.app.VelocityEngine;
import org.springframework.ui.velocity.VelocityEngineUtils;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedWriter;
import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
/**
* @author <a href="mailto:youmail@yourdomain.com">yourname</a> Date: 2004-11-22
*/
public class ViewVelocityTemplateController implements Controller
{
private VelocityEngine engine;
private String encoding;
public VelocityEngine getEngine()
{
return engine;
}
public void setEngine(VelocityEngine engine)
{
this.engine = engine;
}
public String getEncoding()
{
return encoding;
}
public void setEncoding(String encoding)
{
this.encoding = encoding;
}
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception
{
response.setContentType("text/html;charset=gb2312");
String relativeUri = request.getRequestURI().replaceFirst(request.getContextPath(), "");
File reportFilePath = new File(request.getSession(true).getServletContext().getRealPath(relativeUri));
if (reportFilePath.exists())
{
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(response.getOutputStream()));
VelocityEngineUtils.mergeTemplate(engine, relativeUri, encoding, getVelocityContextFromRequest(request), writer);
writer.flush();
writer.close();
} else
{
setError404(response);
}
return null;
}
/**
* 从request中构建VelocityContext对象(提取request中的属性值)
*
* @param request HttpServletRequest变量
* @return VelocityContext对象
*/
private Map getVelocityContextFromRequest(HttpServletRequest request)
{
Map context = new HashMap();
Enumeration allAttrKey = request.getAttributeNames();
while (allAttrKey.hasMoreElements())
{
String attrKey = (String) allAttrKey.nextElement();
context.put(attrKey, request.getAttribute(attrKey));
}
return context;
}
/**
* 设置404错误,指定的jasper文件未找到
*
* @param response web的response变量
* @throws java.io.IOException 异常
*/
private void setError404(HttpServletResponse response) throws IOException
{
response.setContentType("text/html;charset=gb2312");
response.setStatus(404);
response.getOutputStream().write("Error:404,File not Found!".getBytes());
}
}
经过以上的设置,通过Spring的IoC和映射机制,我们很容易实现模型复杂的功能,这一切对开发是非常有帮助。
相关文件下载:
ServiceView-servlet.xml
ViewJasperReportController.java
ViewVelocityTemplateController.java
XmlRpcController.java |