MyEclipse三大框架SSHStruts2+Spring+Hibernate快速整合开发.docx
《MyEclipse三大框架SSHStruts2+Spring+Hibernate快速整合开发.docx》由会员分享,可在线阅读,更多相关《MyEclipse三大框架SSHStruts2+Spring+Hibernate快速整合开发.docx(19页珍藏版)》请在冰点文库上搜索。
MyEclipse三大框架SSHStruts2+Spring+Hibernate快速整合开发
MyEclipse7.5快速半手工开发SSH2(Struts2+Spring+Hibernate)应用
1.新建一个WebProject,命名为:
struts2_template
2.导入样例程序struts2-blank-2.1.8.war中lib下的包
(暂时只需要这几个,网上提醒不能随便加包!
):
commons-fileupload-1.2.1.jar
commons-io-1.3.2.jar
freemarker-2.3.15.jar
ognl-2.7.3.jar
struts2-core-2.1.8.jar
xwork-core-2.1.6.jar
如果出现类似Unabletoloadconfiguration.-bean-jar:
file:
的错误,一般可能是导入的jar包有问题了。
但是,当你更正了问题之后
错误还出现!
这是因为你没有将发布到tomcat中的应用移除干净!
!
方法是:
退出MyEclipse,到workspace文件夹中,找到原来的工程文件夹,删除之;
然后再到workspace的
.metadata\.me_tcat\webapps
文件夹中,找到相应的发布文件夹也删除之,然后重新启动MyEclispse就可以了。
提醒:
如果你做了许多工程,后来删除了。
。
。
。
其实都还在
.metadata/.me-tcat/webapps下面!
!
!
如果他们有错,就会影响到你后来的工程!
3.在web.xml中加入支持struts2的filter,并将mapping设为/*
Filter的名字叫“struts准备与执行”,就是strutsPrepareAndExecute,敲入前面几个字母系统就会找到了。
--------------------到此为止,我们的工程已经可以支持struts2了。
下面是实验--------------
4.在src目录中拷贝一个struts.xml作为书写配置的起点
(注意!
和以前版本不同,是src目录!
)
一个最简单的配置文件包括下面内容:
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEstrutsPUBLIC
"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"
"http:
//struts.apache.org/dtds/struts-2.0.dtd">
/index.jsp
--Addactionshere-->
--Addpackageshere-->
其中重要的其实就一个:
action的执行和导航。
上面的
表示,当从URL请求名为HelloWorld的action时候,实际执行的是example.HelloWorld类。
附注:
类的分包:
在src下面建包即可。
/index.jsp
表示当HelloWorld返回字符串“gotoIndex”时候,跳转到/index.jsp。
5.下面建一个实现上面action的类。
先在src下面建一个package,名为example;
下面建一个HelloWorld类,继承ActionSupport(在com.opensymphony.xwork2中)
里面就一个函数:
publicStringexecute()throwsException{
System.out.println("Hellofromwww.WarpSpeedE");
return"gotoIndex";
}
6.运行一下试试,访问URL为/HelloWorld.action
浏览器还是显示index.jsp,因为这个action自动跳到index.jsp了,
但console窗口却出现了提示,说明该action已经运行。
=========好了,我们的action已经配置成功了===========
7.下面我看看表单的提交;表单当然是放在jsp文件中。
我们将jsp文件放到WebRoot下面(!
这才是网站的根目录!
)。
作为实验,我们建一个子目录login来存放我们的样例表单login.jsp;
(遗憾的是现在还没有理想的可视化的编辑struts2表单的IDE)
一个最基本的jsp文件如下:
<%@pagecontentType="text/html;charset=UTF-8"%>
<%@taglibprefix="s"uri="/struts-tags"%>
也就是说,最上面两行最关紧要!
拷下即可。
然后,使用DreamWeaver之类,编写相应的表单:
下面是使用Eclipse自动生成的带表单的一个简单页面:
------------------------------------------------------------------------
DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
www.WarpSpeedE
---->
Login: | |
Password: | |
|
-----------------------------------------------------------------------------
我们做一下修改即可将它变成struts2的jsp表单页面:
(1)第一行替换成struts2要求的那两行<%@...
(2)替换所有表单字段。
例如:
替换成:
formaction="Login">
注意:
这里的action="Login"指明要提交给一个名为Login的action
换成:
textfieldname="login"/>
替换成
passwordname="password"/>
替换成:
submit/>
惊奇小发现:
我在MyEclipse7.5中发现一个WebPageEditor,用这个编辑器可以插入struts2的标签!
虽然还很是primitive,但总是好多了,。
。
。
好了,改名存盘为login.jsp。
8.我们的action还没有呢!
好办,将HelloWorld.java拷贝粘贴一个出来Login.java:
packageexample;
importcom.opensymphony.xwork2.ActionSupport;
publicclassLoginextendsActionSupport{
publicStringexecute()throwsException{
return"toIndex";
}
}
再做这样一些工作:
(1)把表单字段写出来:
privateStringlogin;
privateStringpassword;
(2)菜单Source->GenerateGetters&Setters生成所有的getter和setter方法。
注意了啊!
看似简单,实际上内涵极为深奥:
这里的setter可是struts2“注入”调用的
(当我们执行execute()的时候,表单字段已经设置好了!
)
(3)修改执行函数,把表单的输入打印到控制台(console,这样打印没什么用处,只是试验一下而已):
publicStringexecute()throwsException{
System.out.println(login+":
"+password);
return"gotoIndex";
}
9.好了,现在东西都有了,只要配置一下struts.xml,就可以让表单login.jsp提交给Login.action了:
拷贝一份原来的action,修改一下:
/index.jsp
10.部署并运行看看
---hmm,还可以,console打印出来输入的值,页面跳到index.jsp了。
。
。
但是!
好像输入表单本身的现实有些怪!
为什么呢?
看看页面源码:
怎么多出来许多table标签呢?
-----原来,默认模式下,struts2会将你的form标签自动加上table标签!
可是我们已经做好了table了,美工过了!
对策:
简单:
类似下面那样加上这样theme属性即可:
textfieldname="login"theme="simple"/>
要求struts使用simple主题,它就不多事了。
11.数据的显示:
Struts将action处理的数据(包括表单提交给action的数据)和应用(Application)范围内的数据
都存储在一个叫做“值栈”(valueStack)的地方;有很多种方法可以从这里取出值来:
我们将struts.xml中Login.action的配置改一下,让它转到logok.jsp页面:
/login/logok.jsp
然后做一个logok.jsp,放到WebRoot/login目录下,其内容主要是在body标签中间,加上:
textname="login"/>
propertyname="login"/>
${login}
这样3行代码;
运行一下试试。
可以看到,三种方法都可以将输入的用户名显示出来。
12.老革命的老问题:
汉字问题
试试输入一个汉字,显示出来的是乱码。
解决:
方法很多;不过既然我们要整合Spring,不如现在就使用Spring的解决模式:
13.加入Spring支持:
在工程名上点鼠标右键,在菜单中选择“MyEclipse”->“AddSpringCapabilities”;
选中所有Spring开头的包;
选择“拷贝支持包到lib目录”;另注意:
(1)注意将applicationContext.xml放到WEB-INF/目录下;
(2)增加一个listener:
ContextLoaderListener
(3)删除掉重复的包:
asm和cglib
14.解决汉字乱码问题:
在web.xml中,增加一个filter:
org.springframework.web.filter.CharacterEncodingFilter
并设置两个参数:
encoding=UTF-8
forceEncoding=true
设置其mapping为/*
再输入汉字试试,没问题了吧!
(没有告诉你的小秘密:
如果你还是出错误,那么在web.xml的filter配置中,
看看是否encodingfilter放到了strutsfilter的后面...提到(map到)前面来!
)
15.增加Hibernate支持
现在干脆将Hibernate的支持一并加入:
只需要注意几点:
选中前面三个包;拷贝到lib目录;使用Spring的配置文件。
16.启动数据库。
我们使用MyEclipse自带的“德贝(Derby)”数据库:
Window->Show->DBBrowser中,双击MyEclipseDerby即可启动数据库。
17.逆向工程生成ORM对象和DAO类
在Derby数据库中,找到CLASSICCARS,右击CUSTOMER表,选择Hibernate逆向工程
选择Javasrcfolder(我们以前已经创建了一个src/hib目录,就用它)
选中三个复选框,但不生成抽象类。
Finish!
18.看看我们完成了什么:
hib目录下面生成了许多类,其中最重要的是CustomerDAO,我们可以通过其中的
getFromApplicationContext(ApplicationContextctx)
静态方法得到它的一个实例,就可以开始数据操作了!
19.将HelloWorld.java复制一个到ListCustomers.java
然后修改其execute方法:
publicStringexecute()throwsException{
ApplicationContextct=WebApplicationContextUtils
.getWebApplicationContext(ServletActionContext
.getServletContext());
CustomerDAOdao=
CustomerDAO.getFromApplicationContext(ct);
Listlist=dao.findAll();
intn=list.size();
for(inti=0;iCustomerc=list.get(i);
Stringname=c.getCustomername();
Stringphone=c.getPhone();
System.out.println(name+":
"+phone);
}
return"gotoCustomerList";
}
直接从浏览器地址栏访问一下这个action:
http:
//localhost:
8080/ListCustomers
会发现客户的信息已经打印到console中了,只是由于没有配置导航,所以页面显示404错误。
没关系,下面fix这个问题。
遗留问题:
网上有说:
action当然不应该封装业务逻辑,但是action是controller,比如在
一个action里面可能会由几个BusinessService的方法组成一个流程,
如果仅对service的方法实现事务控制,那如果流程中某一个service
的方法出现了问题,流程中之前调用的其他service怎么回滚呢。
20.在页面view显示结果
先在struts.xml中配置导航:
/login/customerlist.jsp
上面导航要求控制跳转到customerlist.jsp,因此我们需要在login子目录中,新建一个customerlist.jsp,其内容可先从原来的页面中拷贝过来。
核心代码:
iteratorvalue="list">
name:
propertyvalue="customername"/>
city:
${city}
address:
textname="addressline1"/>
iterator>
这里面,我们尝试了几种不同的表现方法。
首先,是iterator>标签。
它的作用是遍历由value指定的“集合型”对象(一般为Map或List类型);
然后是property>标签,它的作用是将iterator中的对象的属性取出来。
propertyvalue="customername"/>的作用相当于调用list的getCustomername()方法。
从上面的代码中可以看出,除了使用property>之外,我们还尝试了另外两种标签方法,一是text>,它可以生成一个国际化的信息文本;一个是${city},好象是OGNL表达式语言。
细节问题以后研究。
网上说:
既然是struts2,就尽量用struts2的标签。
又说:
OGNL是主流,和…>配合使用
注意:
!
上面的代码有一个重大问题!
实际上它的运行结果是空,不显示任何东西!
为什么呢?
因为:
看看上面execute()方法中的一个变量声明(带下划线的那句):
Listlist=dao.findAll();
这个变量(属性)就是我们在iterator>标签中要迭代(循环)的那个对象。
但是,迭代的对象必须是action类的属性!
而且必须有getter方法!
所以,ListCustomers.java类中必须先声明一个属性:
privateListlist;
然后,再加入一个list的getter方法:
publicListgetList(){
returnlist;
}
(而在execute()内部的list前面的类型声明需要去掉。
)
一个实例:
简单新闻发布
1.创建一个表:
表名:
MSG
字段:
id,integer,primarykey
Au,varchar,40
Msg,varchar,255
2.hibernate逆向工程(注意第二页要选hibernatetype,即使用hibernate数据类型,assigned)
3.设计流程(struts.xml):
表单页面index.jsp包含输入表单和数据显示两个部分
action类aaa.java用来接受表单数据。
Action将数据写入数据库后再回去(跳转)向index.jsp
/index.jsp
/index.jsp
4.建struts2表单,其中msg是新闻对象
formaction="aaa"method="post"theme="simple">
ID:
textfieldname="msg.id"value="0">
textfield>
MSG:
textfieldname="msg.msg">
textfield>
AU:
textfieldname="msg.au">
textfield>
submit>
submit>
form>
5.在aaa.java中使用属性msg来接收表单数据。
写入数据的“三板斧”是:
1)获取应用程序上下文
2)获取DAO对象实例
3)获取Session对象并启动事务处理
//1
ApplicationContextct=WebApplicationContextUtils
.getWebApplicationContext(ServletActionContext
.getServletContext());
//2
MsgDAOdao=MsgDAO.getFromApplicationContext(ct);
//3
Sessions=dao.getSessionFactory().openSession();//HibernateSessionFactory.getSession();////
Transactiontx=s.beginTransaction();
//////////////////////下面是正是操作数据库
try{
dao.attachDirty(msg);
}catch(Exceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
//////////////////////最后是收场:
完成事务过程
mit();
6.运行程序看看,数据是否已经写入表中
7.如果你希望在页面显