2014-09-04 82 views
0

我想在Velocity Servlet中使用会话数据。我正在用Eclipse调试servlet。该servlet似乎可以工作(消息更改除外),但名称变量不会保留在对话中的上下文中。我是否将会话数据存储在错误的地方?或者我有配置问题?如何使Apache速度应用程序会话感知?

HelloWorld.java

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import org.apache.velocity.Template; 
import org.apache.velocity.context.Context; 
import org.apache.velocity.tools.view.VelocityViewServlet; 
public class HelloWorld extends VelocityViewServlet 
{ 
    private static final String HELLO = "Hello! World!"; 
    private static final String GOODBYE = "Goodbye! Columbus!"; 
    private static final String NAME = "name"; 
    protected Template handleRequest(HttpServletRequest request, 
      HttpServletResponse response, Context ctx) 
    { 
      Template template = null; 
     try {template = getTemplate("hello.vm");} 
     catch (Exception e) {throw new RuntimeException(e);} 
     String name = (String)ctx.get(NAME); 
     if (HELLO.equals(name)) 
      name = GOODBYE; 
     else 
      name = HELLO; 
     ctx.put(NAME, name); 
     return template; 
    } 
} 

hello.vm

<html> 
    <head> 
     <script> 
      function goodbye() 
      { 
       var form = document.createElement('form'); 
       form.setAttribute('method', 'post'); 
       form.setAttribute('action', '/HelloWorld?x=yes'); 
       form.style.display = 'hidden'; 
       document.body.appendChild(form); 
       form.submit(); 
      } 
     </script> 
    </head> 
    <body> 
     <h4>$name</4> 
     <button type="submit" onclick="goodbye()">Good-bye</button> 
    </body> 
</html> 

tools.xml

<?xml version="1.0"?> 
<tools> 
    <toolbox scope="session"> 
     <tool key="hello" class="HelloWorld"/> 
    </toolbox> 
</tools> 

的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"> 
    <servlet> 
     <servlet-name>hello</servlet-name> 
     <servlet-class>HelloWorld</servlet-class> 
    </servlet> 
    <servlet> 
     <servlet-name>serv</servlet-name> 
     <servlet-class>org.apache.velocity.tools.view.VelocityViewServlet</servlet-class> 
     <init-param> 
      <param-name>org.apache.velocity.toolbox</param-name> 
      <param-value>/WEB-INF/tools.xml</param-value> 
     </init-param> 
     <init-param> 
      <param-name>org.apache.velocity.properties</param-name> 
      <param-value>/WEB-INF/velocity.properties</param-value> 
     </init-param> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>serv</servlet-name> 
     <url-pattern>*.vm</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
     <servlet-name>hello</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 
</web-app> 

回答

0

你把类的HelloWorld的对象你的工具箱里。但HellowWorld是一个servlet!该工具箱仅仅包含基本的普通旧Java对象与getter和setter。

你需要做的是使用你的servlet代替的VelocityViewServlet,在web.xml中的servlet 标签。

然后,我不知道你打算做什么,但在一个模板中,你可以用$ session引用你的会话。

如果你的会话有一个'name'属性,那么$ name将返回这个属性(假如它没有被嵌套的较小范围中的值,请求范围或上下文本身重载)。

使用最新版本的Velocity/VelocityTools,您可以使用$ session.name来获取或设置name属性。对于较老的,你仍然需要使用$ session.setAttribute('name','value')来设置属性。