论坛首页 Java企业应用论坛

spring学习记录二

浏览 2814 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-04-23   最后修改:2009-04-23

用ssh框架实现简单的登陆注册功能,首先:建表

create database user;
use user;

create table user(id int not null primary key auto_increment,username varchar(45) not null,password varchar(45) not null);

先插入一条数据,

insert into user(username,password)values(‘admin’,’admin’);
提醒以下插入的用户名可不能太短阿,呵呵
好了,表建好了现在要在建一个项目
首先我们先建一个项目sshPro,在该项目包下见文件夹WEB-INF 后面就都不说了,都应该知道该干什么了
将hibernate,spring,struts提供的核心jar包都放在lib下,还有数据库连接的jar包,我用的是mysql数据库,
如果对那些jar包不是很理解,直接全部加进去得了,不过带来的后果是服务器启动的速度会减慢很多,所以,要花些时间去研究一下那些jar包都是干吗的,反正我是一股脑全加进去了
别忘了在开发工具中导入相关jar包,或者直接放在jdk目录下
先写表的映射User.java
public class User implements java.io.Serializable {
private Integer id;
private String username;
private String password;

public Integer getId() {
return this.id;
}

public void setId(Integer id) {
this.id = id;
}

public String getUsername() {
return this.username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return this.password;
}

public void setPassword(String password) {
this.password = password;
}
}
下面写User.hbm.xml文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="po.User" table="user">
        <id name="id" type="integer">
            <column name="id" />
            <generator class="increment" />
        </id>
        <property name="username" type="string">
            <column name="username"/>
        </property>
        <property name="password" type="string">
            <column name="password" />
        </property>
        <property name="job" type="string">
            <column name="job" />
        </property>
        <property name="fav" type="string">
            <column name="fav" />
        </property>
    </class>
</hibernate-mapping>


要说明的是在导入hibernate可以不用写配置文件了,我们可以直接在spring的配置文件中去写,在项目根目录下写一个applicationContext.xml的配置文件,名字可以自己起,不过工具生成的大都是这个样子

下面我们加入spring的支持
首先写配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">



<!—用配置文件直接就可以实现数据库的连接,不必再写hibernate的配置文件-->
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="com.mysql.jdbc.Driver">
</property>
<property name="url"
value="jdbc:mysql://localhost:3306/user">
</property>
<property name="username" value="root"></property>
<property name="password" value="123"></property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!—用spring提供的session工厂bean同样可以 获取session但是我们并没有看到,哪些代码调用了session-->
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>po/User.hbm.xml</value>
</list>
<!—用list来加 映射文件-->
</property>
</bean>
</beans>


可以看到我们在该配置文件中已经建好了hibernate的支持
下面动手写dao:
UserDao.java
package dao;

import java.util.List;

import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import po.User;

public class UserDao extends HibernateDaoSupport{
private static String hql ="from User u where u.username=?and u.password=?";

public boolean login(String username,String password){
HibernateTemplate temp =this.getHibernateTemplate();

Object[] o={username,password};
List l =temp.find(hql,o);
if(l.size()>0){
return true;
}

return false;
}
}
因为我们要为dao 加入了spring支持,所以,要在applicationContext中加入一个bean,该bean拥有sessionFactory属性,可以直接注入bean sessionFactory
<bean id ="userdao" class="dao.UserDao">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean>

接下来是action
loginAction.java
package action;
import com.opensymphony.xwork2.ActionSupport;
import dao.UserDao;
public class loginAction extends ActionSupport{

private UserDao dao;
private String username;
private String password;
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 UserDao getDao() {
return dao;
}
public void setDao(UserDao dao) {
this.dao = dao;
}
public String execute() throws Exception {
boolean b =this.dao.login(username, password);
if(b){
return this.SUCCESS;
}
return this.INPUT;

}

}
为了体现struts,我们还可以为loginaction加一个xml的表单验证,该文件必须和loginAction.java放在同一目录下
xml文件如下:注意命名:
loginAction-validation.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
  "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
  "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
  <field name="username">
    <field-validator type="requiredstring">
     <message>
      用户名不能为空
  </message>
    </field-validator>
    <field-validator type="regex">
    <param name="expression">
    <![CDATA[(\w{4,8})]]>
    </param>
    <message>用户名必须是4到8位数字和字母的组合</message>
    </field-validator>
  </field>
 
  <field name="password">
    <field-validator type="requiredstring">
     <message>
      密码不能为空
  </message>
    </field-validator>
  </field>
</validators>
将loginAction以bean的形式注入spring配置文件中,在appliactionContext.xml文件中加入以下配置:

<bean id="loginaction" class="action.loginAction">
<property name="dao">
<ref local="userdao"/>
<!—导入userdao属性-->
</property>
</bean>

现在我们写struts.xml文件
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.i18n.encoding" value="gbk"/>
<package name="default" extends="struts-default">
<action name="login" class="loginaction">
<!—这里是不是觉得有点变化呢,是的,我已经把类配置到applicationContext.xml中去了,在这里直接引用就可以了,就是那个id是loginaction的bean -->
<result name="success">/success.jsp</result>
<result name="input">/fail.jsp</result>
</action>

</package>
</struts>

最后可不要忘了web.xml的配置,需要一个ContextLoadListener(org.springframework.web.context.ContextLoaderListener)的监听和一个struts的FilterDispatcher(org.apache.struts2.dispatcher.FilterDiapatcher)过滤器
配置内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<filter>
  <filter-name>struts2</filter-name>
  <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
  <filter-name>struts2</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>

根据配置文件我们来写最外层的网页把:

login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<html>
  <head>
  <title>login.jsp</title>
</head>
<body>
<font size="5" color="redd"> 登陆页面,请登陆</font>
<s:form action="login" method="post" validate="true">
<!—这里将validate值设成true,支持表单验证-->
    <s:textfield name="username" label="用户名"></s:textfield>
    <s:password name="password" label="密码"></s:password>
    <s:submit value="登陆"></s:submit>
    <s:reset value="重置"></s:reset>
    </s:form>
  </body>
</html>
success.jsp

<%@ page pageEncoding="gbk"%>
<html>
<body>
    恭喜你,成功!!!
  </body>
</html>
fail.jsp:

<%@ page pageEncoding="gbk"%>
<html>
<body>
   对不起,失败!!!
  </body>
</html>

下面要实现注册功能:


先,在UserDao.java中添加以下方法:

public boolean regist(User u){
HibernateTemplate temp = this.getHibernateTemplate();
if(u!=null){
temp.save(u);
return true;
}
return false;
}


接下来写action
registAction.java
package action;

import po.User;

import com.opensymphony.xwork2.ActionSupport;

import dao.UserDao;

public class registAction extends ActionSupport {
private UserDao dao;
    private User user;
public UserDao getDao() {
return dao;
}
public void setDao(UserDao dao) {
this.dao = dao;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String execute() throws Exception {
boolean b = this.dao.regist(user);
if(b){
return this.SUCCESS;
}
return this.INPUT;
}

}
现在要 写的是用来验证表单的registAction-validation.xml:
内容和loginAction-validation.xml一样,把名字改以下就行了,这里就不写了

现在需要在spring的配置文件中加入以下配置

<bean id="registaction" class="action.registAction">
<property name="dao">
<ref local="userdao"/>
</property>
<property name="user">
<ref local="user"/>
</property>
</bean>
<bean id ="user" class="po.User"></bean>

该配置的作用是给registAction增加user属性,同时把user注入
接下来是struts.xml文件,所要添加的配置如下:

<action name="regist" class="registaction">
<result name="success">/login.jsp</result>
<result name="input">/fail.jsp</result>
</action>

这些都没什么可说的了,接下来的是:

regist.jsp

<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<html>
  <head>
  <title>login.jsp</title>
</head>
<body>
<font size="5" color="cyan">欢迎来到注册页面</font>
    <s:form action="regist" method="post" validate="true">
    <s:textfield name="user.username" label="用户名"></s:textfield>
    <s:password name="user.password" label="密码"></s:password>
    <s:submit value="注册"></s:submit>
    <s:reset value="重置"></s:reset>
    </s:form>
  </body>
</html>

这样的话一个小小的ssh实现就算是写好了,
下面是我运行出来的结果:









几乎各种能够出现的结果都演示出来了
没有任何异常.................
写一些小小的总结:
1,感受颇深的是要对 对象这个概念要有更加深刻的理解,任何一个对象既可以成为对象也可以成为某一个对象的属性。
2,spring封装的session工厂功能的确很强大,在用myeclipse6.5写这些的时候,刚开始的时候我想直接在UserDao.java的方法中用
ApplicationContext ctx =new  ClassPathXmlApplicationContext("applicationContext.xml");
User u=(User)ctx.getBean("user");
去获得一个User对象,后来运行的时候才发现根本就找不到,老是路径不对,
后来换了一种方法,我在applicationContext中配置bean文件registaction的时候在其属性中直接将user加入,一下子就成功了,对属性的理解又多了一层,对spring的理解也多了一层,任何类在spring中都可以看作是一个bean,也可以是某个bean的一个属性
3,突然间很想了解其底层的实现;

 

   发表时间:2009-04-23  
....LZ... 这是想干吗呢?
代码可以打包么?
0 请登录后投票
   发表时间:2009-04-30  
lz写的一个spring的实现的例子。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics