天天看点

在Netbeans中使用Struts2.0+Spring2.5+Hibernate框架(二)

上一篇文章介绍了在Netbeans6.1中使用SSH框架的准备工作及OR映射的方法,这篇文章则继续介绍如何构建视图层和业务逻辑层以及在此过程中整合Struts和Spring框架。

1、建立业务逻辑。在service包中创建业务接口UserService,代码如下:

package service;

import dao.UserDaoImpl;

import po.User;

/**

 *

 * @author Administrator

 */

public interface UserServive {

    void addUser(String userName, String password, int admin) throws Exception;

    User getUser(long userId);

    User getUser(String userName);

    void setUserDao(UserDaoImpl userDao);

}

创建实现类UserServiceImp,代码如下:

public class UserServiceImpl implements UserServive {

    private dao.UserDao userDao;

    public void addUser(String userName, String password, int admin) throws Exception{

        po.User user = new User();

        //user.setId(10);

        user.setAdmin(admin);

        user.setName(userName);

        user.setPassword(password);

        try

        {

            userDao.save(user);

        }

        catch(Exception err)

            throw err;

    }

    public User getUser(long userId)

    {

        return userDao.getUser(userId);

    public void setUserDao(dao.UserDaoImpl userDao) {

        this.userDao = userDao;

    public User getUser(String userName) {

        return this.userDao.getUser(userName);

注意红色部分代码,为了访问数据库,必须引入userDao的对象,生成set的方法,并通过Spring IoC容器注入该属性,在applicationContext.xml中增加以下配置:

    <bean id="userService" class="service.UserServiceImpl">

        <property name="userDao">

            <ref bean="userDao"></ref>

        </property>

    </bean>

userDao的配置已经在上一篇文章描述过,引用的是以下这段配置:

      <bean id="userDao" class="dao.UserDaoImpl">

        <property name="sessionFactory">

            <ref bean="sessionFactory"></ref>

      </bean>

service的方法就是通过调用dao的实体方法来操作的,如上面代码第二段红色的部分。

2、建立视图。在web页面的example目录下新建JSP页面,命名为Login。在文件头部添加Struts2.0的标签引入:

<%@ taglib prefix="s" uri="/struts-tags" %>

在网页body标签中加入以下代码:

        <s:form action="login" method="POST">

            <s:textfield name="username" label="%{getText('username')}"/>

            <s:password name="password" label="%{getText('password')}"/>

            <s:submit value="%{getText('submit')}"/>

        </s: form>

Struts2.0 的标签库功能很强大,网上有很多例程,在这里就不详述了。关键的地方是lable属性里面的表达式,在这里,是为了国际化而设的。要在Struts2.0 中使用i18N,我们首先要在源包-缺省包中新建一个属性文件(点击新建-其他-属性文件),命名为struts。在struts.properties 中添加定义:

struts.custom.i18n.resources=globalMessages

这条语句指定资源文件的前缀,例如中文的资源文件可以命名为globalMessages_zh_CN,英文的可以命名为globalMessages_en_US。我们在缺省包中分别创建这两个属性文件。在中文的资源文件中加入以下:

username=用户名

password=密码

submit=提交

英文的资源文件加入:

username=Username

password=Password

submit=Submit

然后就可以在JSP页面中用%{getText('username')}的表达式来指定要读出的字符串了。在Struts2.0中,我们不必再手动地把中文转换为Unicode码,框架会自动转换。

3、 创建Action。在action包中点击右键-新建-其他-Struts2-Struts2 Action,命名为LoginAction。Struts2.0中不再需要创建ActionForm,只要生成属性的get和set方法,就能够获取到 页面标签name属性对应的值。在这里,LoginAction继承com.opensymphony.xwork2.ActionSupport。代码 如下:

package action;

import com.opensymphony.xwork2.ActionSupport;

import java.util.Locale;

import org.springframework.context.support.ResourceBundleMessageSource;

import service.UserServiceImpl;

 * @author mg

public class LoginAction extends ActionSupport{

    private UserServiceImpl userService;

    private String message;

    private String username;

    private String password;

    private ResourceBundleMessageSource messageSource;

    public LoginAction() {

    @Override

    public String execute() throws Exception {

        User usr = userService.getUser(username);

        if(usr != null){

            if(usr.getPassword().equals(password)){

                message = messageSource.getMessage("loginSuccess", null,Locale.CHINA);

            }else{

                message = messageSource.getMessage("pswError", null,Locale.CHINA);

            }

        }else{

            message = messageSource.getMessage("usrError", null,Locale.CHINA);           

        return SUCCESS;

    public void setUserService(UserServiceImpl userService) {

        this.userService = userService;

    public String getMessage() {

        return message;

    public void setMessage(String message) {

        this.message = message;

    public String getUsername() {

        return username;

    public void setUsername(String username) {

        this.username = username;

    public String getPassword() {

        return password;

    public void setPassword(String password) {

        this.password = password;

    public void setMessageSource(ResourceBundleMessageSource messageSource) {

        this.messageSource = messageSource;

注意红色代码的属性。其中ResourceBundleMessageSource是Spring 2.5中处理国际化信息的类,UserServiceImp是操作User实体的业务逻辑类。这两个类的实例都是通过Spring IoC容器管理和注入的。因此,必须在applicationContext.xml中添加配置:

    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">  

        <property name="basename" value="messages" />  

    <bean id="loginAction" class="action.LoginAction">

        <property name="userService">

            <ref bean="userService"></ref>

        <property name="messageSource" ref="messageSource"/>

在缺省包中添加属性文件messages.properties,注意文件名要以messageSource的bean定义的basename属性一致。在该资源文件中加入以下信息:

loginSuccess=登录成功

pswError=密码错误,请重新登录

usrError=用户名错误,请检查输入

然后即可以通过messageSource.getMessage("pswError", null,Locale.CHINA)的方法来取得相应的字符串了。

LoginAction中的返回值SUCCESS是ActionSupport中预定义的跳转字符串,在struts.xml的package标签中如下配置:

<struts>

    <include file="example.xml"/>

    <!-- Configuration for the default package. -->

    <package name="default" extends="struts-default">

        <action name="login" class="loginAction">

            <result>/message/message.jsp</result>

        </action>

    </package>

</struts>

Struts2.0 的配置文件精简了很多,但这里有一个问题要注意的,就是login这个action的class,这里写的是loginAction。而这个bean是在 Spring IoC容器里面管理的,见上一段Spring的配置文件。这样,Struts的Action全部由Spring容器来管理,在适当的时候才会实例化和销 毁。而这种整合需要struts2-spring-plugin-2.0.11.1.jar这个工具包。

在web页面中新建路径message,在message路径下新建JSP页面message.jsp,用以下代码覆盖:

<%@ page contentType="text/html; charset=UTF-8" %>

<s:property value="message"/>

注意message是从LoginAction中设置而得的。

至此,这个登陆的例程就完成了,点击example目录下的Login.jsp选择运行文件(注意,不要直接运行工程),得到如下结果:

把浏览器的默认语言改为en_US,刷新一下页面,得到以下结果:

输入正确的用户名和密码,跳转到以下页面:

输入密码错误则提示:

特别鸣谢:

Sun SITE开发组组员 Ruby (Tan Jiazhang) 提供demo的架构整合方案

下一篇文章将介绍如何在视图层整合现在较流行的EXT JS框架,敬请关注。