SSH终于自学完啦!如果说一无所获那是不可能的,但又说不上如何精湛.
我觉得把他看作一看作是一座山坡比较合适,当山坡被采在脚底时,自已
就会上升到另一个高度(虽然这个坡不太高),才能看到更远更高的山峰.
也可以经常在这个山坡上励练自已,为登那远方绝顶奠定基础.
在学习SSH的过程中是有过一些笔记的,可惜现在都身首异处.只能
晒出近期整合的部分啦!可以看作是08年的最后一个阶段,前期的一些
笔记也尽可能抽空处理完.下面来看看我在整合SSH实现登录的一点随
笔吧!
hibernate+struts+spring实现登录
关于ssh的加载可以参看"ssh.doc"
在框架使用过程中我们应该注意怎样去将各个部分细化.
关于此项目的编写我可以简单分一下,下面就分类来说一说.
spring配置文件applocationContext.xml
<?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.0.xsd">
<!-- 数据库的配置 -->
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName"
value="com.microsoft.sqlserver.jdbc.SQLServerDriver">
</property>
<property name="url"
value="jdbc:sqlserver://localhost:1433;databaseName=master">
</property>
<property name="username" value="sa"></property>
</bean>
<!-- hibernateSession的工厂 -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.SQLServerDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>com/risingsun/pojo/Person.hbm.xml</value>
</list>
</property>
</bean>
<!-- hibernate的数据操作模版 -->
<bean id="hibernateTemplate"
class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<!--PersonDAO接口 -->
<bean id="persondao" class="com.risingsun.config.IPersonDAO"
abstract="true">
</bean>
<!-- persondao的实现类 -->
<bean id="persondaoimpl" class="com.risingsun.DAO.PesonDAOImpil"
parent="persondao">
<property name="hibernateTemplate">
<ref bean="hibernateTemplate" />
</property>
</bean>
<!--personAction类的调用 -->
<bean name="/person" class="com.risingsun.struts.action.PersonAction">
<property name="persondao">
<ref bean="persondaoimpl"/>
</property>
</bean>
</beans>
当然这个写完后我们可以用一个java来测试一下,这样比jsp页面快而且容易抓到错误.
public static void main(String[] args) {
// TODO Auto-generated method stub
ApplicationContext ac=null;
ac=new ClassPathXmlApplicationContext("applicationContext.xml");
Person per=new Person();
per.setName("rss");
per.setPassword("123456");
IPersonDAO id=(IPersonDAO)ac.getBean("persondaoimpl");
id.isLogin(per);
}
如果这里没问题的话,那我就可以加载struts.在后面的操作中我们至少可以不用再关心hibernate和struts的问题啦!
唉,差点把hibernate忘掉啦!
其实hibernate在applocationContext.xml中也是存在的,就是person类的那个orm文件的位置.有一部分hibernate文件
也是被集成到spring的applocationContext.xml文件里啦!
hibernate的其它功能就只剩POJO和DAO啦.我们依然可以使用.那该怎样调用DAO类呢,要知道DAO里还有个sessionFactory呢,
这个当然是存在的啦!
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.SQLServerDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>com/risingsun/pojo/Person.hbm.xml</value>
</list>
</property>
</bean>
哈哈,想不到吧!sessionFactory就变成这样啦!
当然还有点要说一下,DAO类要继承HibernateDaoSupport 类,这样我们就可以用到sessionFactory啦!
public class PesonDAOImpil extends HibernateDaoSupport implements IPersonDAO {
public boolean isLogin(Person person) {
// TODO Auto-generated method stub
boolean flag=false;
String HQL="FROM Person AS P WHERE P.name=? AND P.password=?";
Query qe=this.getSession().createQuery(HQL);
qe.setParameter(0,person.getName());
qe.setParameter(1,person.getPassword());
List lst=qe.list();
if(lst.size()>0)
{
System.out.println("欢迎:"+person.getName()+"登录");
flag=true;
}
else
{
System.out.println("错误的用户名或密码");
}
return flag;
}
由此我们不难看出hibernate和spring的结合还是蛮好的嘛!不过struts就没有那么爽啦!struts可是把我折腾的够呛啦!
这里我们要使用动态验证框架,下面一一说下from和action的配置
<form-beans >
<form-bean name="personForm" type="org.apache.struts.validator.DynaValidatorForm">
<form-property name="password" type="java.lang.String" />
<form-property name="name" type="java.lang.String" />
</form-bean>
这就是动态验证from,不用再生成personForm.java文件啦,帅吧!
当然,即然我们要使用验证框架,那就和得和xml文件、资源文件沟通一下啦!
验证文件validation.xml
<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">
<form-validation>
<formset>
<form name="personForm">
<field property="name" depends="required">
<arg key="err.name" resource="true"/>
</field>
<field property="password" depends="required">
<arg key="err.password" resource="true"/>
</field>
</form>
</formset>
</form-validation>
这里的arg key="err.name"对应的就是我们的资源文件啦!
# Resources for parameter 'com.risingsun.struts.ApplicationResources'
# Project spring-8
errors.required={0}/u4e0d/u80fd/u4e3a/u7a7a
err.name=/u7528/u6237/u540d
err.password=/u5bc6/u7801
看上去我们并没有做什么,只是简单处理一个ascii码转换而已。
其它的事都是"validator-rules.xml"搞定的,是不是要多谢下它呢。
这完了我们还得回去struts-config.xml里全做点手脚,加上以下代码
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />
</plug-in>
上面可以通过plugin文件来添加(在新建->others->struts2.0里可以找得到)
还需要在action里启动validate="true",这样我们就可以使用验证框架啦!
<action-mappings >
<action
attribute="personForm"
input="/login.jsp"
name="personForm"
parameter="model"
path="/person"
scope="request"
type="com.risingsun.struts.action.PersonAction" validate="true">
<forward name="sur" path="/login.jsp"></forward>
</action>
form就总算完啦,下面是action。
action这个类还是得存在的(PersonAction.java)
private IPersonDAO persondao;
/**
* Method execute
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
*/
public ActionForward login(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
System.out.println("来啦");
DynaValidatorForm personForm = (DynaValidatorForm) form;// TODO Auto-generated method stub
Person person=new Person();
person.setName(personForm.getString("name"));
person.setPassword(personForm.getString("password"));
if(persondao.isLogin(person))
{
request.setAttribute("user",person);
}
else
{
request.setAttribute("error","错误的用户名或密码");
}
return mapping.findForward("sur");
}
public IPersonDAO getPersondao() {
return persondao;
}
public void setPersondao(IPersonDAO persondao) {
this.persondao = persondao;
}
看到form的取值没有,和往常有所不一样的。
和以前一样我们得配置web.xml文件中加上下面的东东
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/applicationContext.xml</param-value>
</context-param>
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
就样在启动时就可以给我们的请求提供服务啦!当然前提是struts-config.xml得指向他,要不我们的action往那触发呢
1、给struts-config.xml加一个控制器
<controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"></controller>
2、给struts-config.xml加点pugin文件
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/classes/applicationContext.xml" />
</plug-in>
这里和web.xml里的配置近似哦,很显然他们有一定联系。只是我还未渗透。
这样可唯是万事俱备只欠春风啦!
在applicationContext.xml中加入下面的代码:
<!--personAction类的调用 -->
<bean name="/person" class="com.risingsun.struts.action.PersonAction">
<property name="persondao">
<ref bean="persondaoimpl"/>
</property>
</bean>
看到了吧“<bean name="/person"”这个可以servlet哦,就是指向咱们的那个PersonAction.java
这样ssh里Over啦!不过UI还得搞它一搞!
<logic:present name="user" scope="request">
<h1>欢迎${requestScope.user.name}登录</h1>
</logic:present>
<logic:present name="error" scope="request">
<h1>${requestScope.error}</h1>
</logic:present>
<html:form action="/person.do" method="post" οnsubmit="return validatePersonForm(this)">
<table>
<tr>
<td><html:hidden property="model" value="login"></html:hidden></td>
</tr>
<tr>
<td>用户名:<html:text property="name"></html:text></td>
</tr>
<tr>
<td>密码:<html:password property="password"></html:password></td>
</tr>
<tr>
<td><html:submit>登录</html:submit>
<html:reset>重置</html:reset>
</td>
</tr>
</table>
</html:form>
<html:javascript formName="personForm"/>
</body>
</html:html>
jsp文件就没什么搞头啦,不过有几个新玩意得说说!
<html:form action="/person.do" method="post" οnsubmit="return validatePersonForm(this)">这里的onsubmit可是调用validatePersonForm方法的哦!
我们这是看不到得等web跑起来,我们查下他源文件才能看清。
<html:javascript formName="personForm"/>
这句我还不太知情,我想应该是将personForm里的验证框架转成javascriptk吧
(前台自动验证你的表单,当然,前台验证的核心还是javascript,只不过这都由struts的 <html:javascript> 标签帮你实现了)这是csdn里找到的。
OO终于搞完SSH的登录啦,都快吐啦!
写完这段文字时我总算松啦一口气,终于把这个SSH整合到一起啦!相信深爱JAVA的友友们能体会到我此刻的心情.
整合完后我也想了一下,其实SSH并不适合与每个项目.但SSH里运用的各种设计模式和思想,确实值得我们去深思下.
现在可以将SSH假想成设计模式的提炼,但真正的运用还得看日后的付出啦!
说到这个付出,我也不得不自醒一下啦!回想SSH学习的经历,可谓是断断续续啊!幸好是挺到了最后,但不得不改正
的是那飘浮不定的学习心态,看看下面的学习按排我想会更有依居.
2008年8月上半月:这个时节也是在京的最后半个月,也正是此时我开始啦SSH的征途,听的是李新华的Hibernate.
2008年9月的第2个星期:几经周折来到深圳,花了一周的时间学完了struts,当然学得也是很肤浅的.
2009年1月上半月:元旦后重返深圳,花了大半月的时间搞定啦spring和SSH的整合.
可以说hibernate的学习是相对而言最用心的,当时还在北京.
到了struts那一段,就不太安份啦!见了一堆朋友,乱念横生.
spring这块可谓在懒散中度过的......
看一看这期学习周期就发现很多问题:
1、学习目标不明确
2008年9月以后的时间,很大部分被压在项目上啦!此时有冒出了Flex学习的念头。
2009年1月,spring和flash同不进行。
2、杂乱无章
SSH尚未完成时便自切入了FLEX,在SPRING进行时还渗入FLASH。
3、过于懒散
特别是在2009年1月,SPRING和FLASH同时进行时,时间把撑得一塌胡涂。
4、情绪调整不妥
在离京的后期学习中太过情绪化,当然这也是重入社会必经的一些事,但他影
响得有点过头啦!
5、轻浮
居然开始随心而为,偏偏很多东东都是错误的想法,主观意识并没有做出有效
的响应,所谓的引导进行得非常不理想。
随便一扫描就一堆BUG,看来问题不小啊!09年的计划可要慎重啊!
好啊!都很晚啦!明天得回家啦!这份总结也该交啦,明天也会有新的日程。
至于未来,期待新的方向和计划……