Velocity与Struts验证用户登录

来源:互联网 发布:php 单例 引用 编辑:程序博客网 时间:2024/06/05 02:50

velocity-tools-1.4-src中自带的一个例子,位于目录/velocity-tools-1.4-src/examples/struts下面。

测试工程目录结构如下所示:

VelocityStrutsA
│ .classpath
│ .mymetadata
│ .mymetadata.bak
│ .mystrutsdata
│ .project

├─.myeclipse
├─src
│ │ hibernate.cfg.xml
│ │ velocity.properties
│ │
│ └─org
│      └─shirdrn
│          │ HibernateSessionFactory.java
│          │
│          ├─struts
│          │ │ ApplicationResources.properties
│          │ │
│          │ ├─action
│          │ │      EnterAction.java
│          │ │      LoginAction.java
│          │ │
│          │ └─form
│          │          LoginForm.java
│          │
│          └─velocity
│              ├─dao
│              │      VelocityUserDao.java
│              │
│              ├─entity
│              │      VelocityUser.hbm.xml
│              │      VelocityUser.java
│              │
│              └─service
│                      VelocityUserService.java

└─WebRoot
    ├─log
    │      velocity.log
    │
    ├─META-INF
    │      MANIFEST.MF
    │
    ├─templates
    │      index.vm
    │      login.vm
    │
    └─WEB-INF
        │ .struts-config.mex
        │ struts-config.xml
        │ toolbox.xml
        │ web.xml
        │
        ├─classes
        │ │ hibernate.cfg.xml
        │ │ velocity.properties
        │ │
        │ └─org
        │      └─shirdrn
        │          │ HibernateSessionFactory.class
        │          │
        │          ├─struts
        │          │ │ ApplicationResources.properties
        │          │ │
        │          │ ├─action
        │          │ │      EnterAction.class
        │          │ │      LoginAction.class
        │          │ │
        │          │ └─form
        │          │          LoginForm.class
        │          │
        │          └─velocity
        │              ├─dao
        │              │      VelocityUserDao.class
        │              │
        │              ├─entity
        │              │      VelocityUser.class
        │              │      VelocityUser.hbm.xml
        │              │
        │              └─service
        │                      VelocityUserService.class
        │
        └─lib
                antlr-2.7.5H3.jar
                antlr.jar
                asm-attrs.jar
                asm.jar
                cglib-2.1.jar
                commons-beanutils.jar
                commons-collections-2.1.1.jar
                commons-digester.jar
                commons-fileupload.jar
                commons-logging-1.0.4.jar
                commons-logging.jar
                commons-validator.jar
                dom4j-1.6.jar
                ehcache-1.1.jar
                hibernate3.jar
                jaas.jar
                jakarta-oro.jar
                jaxen-1.1-beta-4.jar
                jdbc2_0-stdext.jar
                jta.jar
                log4j-1.2.9.jar
                msbase.jar
                mssqlserver.jar
                msutil.jar
                struts.jar
                velocity-1.4.jar
                velocity-dep-1.4.jar
                velocity-tools-1.4.jar
                velocity-tools-view-1.4.jar
                xerces-2.6.2.jar
                xml-apis.jar

准备工作

VelocityUser.hbm.xml是映射数据库表的,VelocityUser.java中包含了三个字段:id、name、password。

VelocityUserDao是VelocityUserService的接口,实现了查询VelocityUser的功能。

关于Velocity

这里使用了velocity.properties属性文件,设置编码,内容如下所示:

default.contentType=text/html; charset=UTF-8
input.encoding=UTF-8
output.encoding=UTF-8
file.resource.loader.path = templates
runtime.log = log/velocity.log

使用到了两个Velocity模板文件,分别为login.vm和index.vm。

login.vm文件如下所示:

<HTML>
<HEAD>
    <TITLE>用户登录页面-当前时间为: $date.get('yyyy-M-d H:m:s')</TITLE>
</HEAD>
<BODY bgcolor="">
<center>
#errorMarkup()
    <FORM method="POST" action="$link.action.login">
      <h2>用户登录</h2>
      <br>
      用户名:<INPUT type="text" name="name" alue=""><br>
      密 码:<INPUT type="password" name="password"><br>
      <INPUT type="submit" value="Submit" name="submit">
    </FORM>
    <br>
    </center>
    #macro (errorMarkup)
            #if ($errors.exist() )
                <ul>
                #foreach ($e in $errors.all )
                    $e
                #end
                </ul>
            #end
    #end
</BODY>
</HTML>

这里用到了toolbox.xml中指定的一些工具,如:org.apache.velocity.tools.generic.ComparisonDateTool工具、org.apache.velocity.tools.struts.StrutsLinkTool工具。

在定义的Velocity宏中,这里用到了toolbox.xml中的org.apache.velocity.tools.struts.ErrorsTool工具,即对登录用户名和密码为空时进行验证。

其中,登录成功后,进入index.vm页面,如下所示:

<html>
<head>
   <title>首页-欢迎成功登录</title>
</head>
<body>
#if($velocityUser)
   <h3>您好,当前时间为: $date.get('yyyy-M-d H:m:s')</h3>
   <center>
    您的登录用户名为:$velocityUser.name,密码为:$velocityUser.password。
   </center>
#end
</body>
</html>

一些Velocity工具在toolbox.xml中定义,toolbox.xml的内容如下所示:

<?xml version="1.0"?>
<toolbox>
   <tool>
    <key>date</key>
    <scope>application</scope>
    <class>org.apache.velocity.tools.generic.ComparisonDateTool</class>
    <parameter name="format" value="yyyy-MM-dd"/>
    <parameter name="depth" value="2"/>
    <parameter name="skip" value="month"/>
</tool>
<!-- Struts Tools -->
<tool>
     <key>link</key>
     <scope>request</scope>
     <class>
       org.apache.velocity.tools.struts.StrutsLinkTool
     </class>
</tool>
<tool>
     <key>msg</key>
     <scope>request</scope>
     <class>
       org.apache.velocity.tools.struts.MessageTool
     </class>
</tool>
<tool>
     <key>errors</key>
     <scope>request</scope>
     <class>
       org.apache.velocity.tools.struts.ErrorsTool
     </class>
</tool>
<tool>
     <key>form</key>
     <scope>request</scope>
     <class>
       org.apache.velocity.tools.struts.FormTool
     </class>
</tool>
<tool>
     <key>tiles</key>
     <scope>request</scope>
     <class>
       org.apache.velocity.tools.struts.TilesTool
     </class>
</tool>
<tool>
     <key>validator</key>
     <scope>request</scope>
     <class>
       org.apache.velocity.tools.struts.ValidatorTool
     </class>
</tool>
</toolbox>

而且,还要将toolbox.xml在web.xml中配置好,当应用启动的时候会根据初始化配置参数加载所有可用的Velocity工具。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <init-param>
      <param-name>debug</param-name>
      <param-value>3</param-value>
    </init-param>
    <init-param>
      <param-name>detail</param-name>
      <param-value>3</param-value>
    </init-param>
    <load-on-startup>0</load-on-startup>
</servlet>

<servlet>
<servlet-name>velocity</servlet-name>
<servlet-class>org.apache.velocity.tools.view.servlet.VelocityViewServlet</servlet-class>
<init-param>
    <param-name>org.apache.velocity.properties</param-name>
    <param-value>/WEB-INF/classes/velocity.properties</param-value>
</init-param>                                           
<init-param>
    <param-name>org.apache.velocity.toolbox</param-name>
    <param-value>/WEB-INF/toolbox.xml</param-value>     
   </init-param>                                                
   <load-on-startup>10</load-on-startup>
</servlet>


<servlet-mapping>
<servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>velocity</servlet-name>
<url-pattern>*.vm</url-pattern>     
</servlet-mapping>
</web-app>

关于Struts

Struts的配置文件struts-config.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">

<struts-config>
<data-sources />
<form-beans >
    <form-bean name="loginForm" type="org.shirdrn.struts.form.LoginForm" />

</form-beans>

<global-exceptions />
<global-forwards />

<action-mappings >
    <action
    path="/enter"
    type="org.shirdrn.struts.action.EnterAction" >
    <forward name="enter" path="/templates/login.vm" />
    </action>
    <action
      attribute="loginForm"
      name="loginForm"
      path="/login"
      scope="request"
      input="/templates/login.vm"
      validate="true"
      type="org.shirdrn.struts.action.LoginAction">
      <forward
        name="error"
        path="/templates/login.vm" />
      <forward
        name="success"
        path="/templates/index.vm"
        redirect="true" />
    </action>
</action-mappings>

<message-resources parameter="org.shirdrn.struts.ApplicationResources" />
</struts-config>

其中,当登录用户名和密码都为空的时候,则提示错误信息,在 ApplicationResources.properties中添加:

error.name.required=<li><font color="red">Name is required</font></li>
error.password.required=<li><font color="red">Password is required</font></li>

Struts的Action有两个。

EnterAction就起到跳转到login.vm模板页面的作用,当然也可以让其继承ForwardAction,如下:

package org.shirdrn.struts.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class EnterAction extends Action {

public ActionForward execute(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response) {
   return mapping.findForward("enter");
}
}

LoginAction关联了LoginForm,如下所示:


package org.shirdrn.struts.action;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.shirdrn.struts.form.LoginForm;
import org.shirdrn.velocity.dao.VelocityUserDao;
import org.shirdrn.velocity.entity.VelocityUser;
import org.shirdrn.velocity.service.VelocityUserService;

public class LoginAction extends Action {

public ActionForward execute(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response) {
   LoginForm loginForm = (LoginForm)form;
   VelocityUser vu = new VelocityUser();
   vu.setName(loginForm.getName().trim());
   vu.setPassword(loginForm.getPassword().trim());
   VelocityUserDao velocityUserDao = new VelocityUserService();
   List list = velocityUserDao.queryVelocityUser(vu);
   HttpSession session = request.getSession();
   session.setAttribute("velocityUser", vu);
   if(list.size() <1){
    return mapping.findForward("error");    //   登录失败则回到登录页面
   }
   return mapping.findForward("success");
}
}

对应的LoginForm如下:

package org.shirdrn.struts.form;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;

public class LoginForm extends ActionForm {

private String name;
private String password;

public ActionErrors validate(ActionMapping mapping,
    HttpServletRequest request) {     // 验证登录表单
   ActionErrors errors = new ActionErrors();
        if ((name == null) || (name.length() < 1))
            errors.add("name", new ActionMessage("error.name.required"));
        if ((password == null) || (password.length() < 1))
            errors.add("password", new ActionMessage("error.password.required"));
        return errors;
}

public void reset(ActionMapping mapping, HttpServletRequest request) {
  
}

public String getName() {
   return name;
}

public void setName(String name) {
   this.name = name;
}

public String getPassword() {
   return password;
}

public void setPassword(String password) {
   this.password = password;
}
}

验证表单的时候,将错误信息存储到errors中,通过Velocity的org.apache.velocity.tools.struts.ErrorsTool工具,定义一个Velocity宏来实现错误信息的显示。