JAVA学习
资料:http://www.ibm.com/developerworks/cn/java/j-lo-appfuse/index.html 照葫芦画瓢完成的内容。
两个月前hofman就建议我去看看appfuse,英文不好一直没什么信心,最近几天研究spring一直没有进展就反思了下,越想越觉得窝囊憋气,感觉基本上都是英文不好导致的效率如此低下,因为一直是在看网上到处转载的文章,官方的文档不太敢看。再加上开发环境不熟,结果就一次一次的碰壁。
于是决定尝试一下其他的方法,就想到了appfuse了,弄了一整天了,还好没有什么中文的文档,于是只好开着“谷歌金山词霸合作版”来读官方文档了。文档在这里:AppFuse QuickStart,比我想象中要容易懂的多,其实一直不怎么敢看,硬这头皮还是能看懂不少的,另一篇讲使用eclipse安装appfuse plugin 的文章更容易懂,不过没有什么实例。
视频教程:http://appfuse.org/display/APF/Demos+and+Videos,项目可以用Eclipse, IDEA or NetBeans打开,视频里使用的是IDEA,我用的是 eclipse。
and my half product right here. 等实际项目出来是补教程,现在睡觉。
首先下载必须的软件:
Windows Service Installer
Jdk: http://java.sun.com/javase/downloads/index.jsp
你可以选择带有 jre 的安装文件或者你机器里现在有 jre 环境则只需要下载 JDK.
Java SE 6 Update 10 Beta (不带JRE)
JDK 6 Update 6 (带JRE)
Java Runtime Environment (JRE) 6 Update 6 (JRE)
下面按步骤来:
1.安装JDK和JRE
一直下一步到安装完成,记住JDK安装的路径。
2.设置JDK相关的环境变量
1).切换到桌面,右键点击“我的电脑” -> 属性 -> 高级 -> 如图 建立一个 JAVA_HOME 环境变量,变量值为JDK的根目录。
2).和上面一样的操作,建立 环境变量 CLASSPATH,值为 “.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\jre\lib\rt.jar”
3).还是操作环境变量但不是新建,而是编辑。编辑 Path 变量,最变量值最后面加上 ;%JAVA_HOME%\bin;
3.安装Tomcat
1).一直下一步,中间需要选择安装路径和 JVM 目录,如果JDK和JRE安装没问题,这里他应该能自动找得到,否则需要你手动指定一下。 中间什么也不用管,有一部让你设置端口,不用动,保持默认的就行了。
2).新增一个 CATALINA_HOME 环境变量,变量值为你TOMCAT安装时的根目录。
3.测试运行服务器
进入Tomcat 下的 bin目录,你可以发现两个可执行文件,分别是 tomcat6.exe(外挂形式启动) tomcat6w.exe(当成服务启动) ,推荐使用 tomcat6.exe 来启动,如果你会DOS的话,最好开一个DOS窗口去运行 tomcat6.exe,这样如果出错了则能及时的看到错误提示。 需要注意的是如果启动失败最大的可能就是服务已经启动了,你需要在DOS下运行 “net stop tomcat6”先关闭服务。
4.编写程序测试下Tomcat环境是否能运行
进下Tomcat下的 webapps 目录,新建一个自己的目录,例如 samples1。
进入samples1
1).新建文件 index.jsp
2).新建目录WEB-INF
3).进入WEB-INF目录新建文件 web.xml
index.jsp 文件代码:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>我的第一个JSP页面。</title>
</head>
<body>
Hello world! <br>
<%
String name = "meiking";
out.println(name);
%>
</body>
</html>
web.xml 文件代码:
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
5.重启 tomcat 后运行刚刚的程序
那么你的环境是否配置好了呢?如果你还没有配置成功请对照上面的步骤,或者留言把你遇到的问题描述尽可能的清楚一些。
先贴我的 action 类,已经精简到单元测试了,在用hibernate直接操作时都是没有问题的:
CategoryAction.java
import "<struts>";
import com.blog.WpTerms;
import com.blog.WpTermTaxonomy;
import com.blog.WpTermsDAO;
import com.blog.WpTermTaxonomyDAO;
public class CategoryAction extends Action {
private WpTermsDAO wpTerms;
private WpTermTaxonomyDAO wpTermTaxonomy;
public void setWpTerms(WpTermsDAO wpt) {
this.wpTerms = wpt;
}
public void setWpTermTaxonomy(WpTermTaxonomyDAO wptTax) {
this.wpTermTaxonomy = wptTax;
}
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
CategoryForm cf = (CategoryForm) form;
// stub
String name = cf.getCatName();
......
try {
WpTerms wpt = new WpTerms();
......
wpTerms.save(wpt);
System.out.println("新目录创建成功: " + wpt.getTermId());
return mapping.findForward("createSuccess");
} catch (Exception e) {
e.printStackTrace();
request.setAttribute("errorMessage", "保存目录信息时出错,错误代码:01。");
}
return mapping.findForward("createFailed");
}
}
WpTermsDAO.java
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.LockMode;
import org.springframework.context.ApplicationContext;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
public class WpTermsDAO extends HibernateDaoSupport {
protected void initDao() {
// do nothing
}
public void save(WpTerms transientInstance) {
System.out.println("============================");
//单无测试只剩这些了,本来应该有不少方法的
}
}
hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="connection.url">jdbc:mysql://localhost:3306/home_wp_blog?useUnicode=true&characterEncoding=UTF-8</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="myeclipse.connection.profile">
com.mysql.jdbc.Driver
</property>
<mapping resource="com/blog/WpTerms.hbm.xml"></mapping>
<mapping resource="com/blog/WpTermTaxonomy.hbm.xml"></mapping>
</session-factory>
</hibernate-configuration>
applicationContext.xml
<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="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml">
</property>
</bean>
<bean id="WpTermsDAO" class="com.blog.WpTermsDAO">
<property name="sessionFactory">
<ref bean="sessionFactory"></ref>
</property>
</bean>
<bean id="WpTermTaxonomyDAO" class="com.blog.WpTermTaxonomyDAO">
<property name="sessionFactory">
<ref bean="sessionFactory"></ref>
</property>
</bean>
<bean name="/category" class="com.blog.struts.action.CategoryAction"
singleton="false">
<property name="wpTerms">
<ref bean="WpTermsDAO" />
</property>
<property name="wpTermTaxonomy">
<ref bean="WpTermTaxonomyDAO" />
</property>
</bean>
</beans>
错误信息:
at com.blog.struts.action.CategoryAction.execute(CategoryAction.java:74)
at org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58)
at org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67)
at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)
我"project"是UTF-8中文编码,用的IDE是eclipse3.3,页面全保持UTF-8,但Mysql 插入的中文值全变成了乱码,mysql也是UTF-8字符集,所以怀疑是hibernate连接时需要加个参数。
- 想请问下hofman等各位大大怎么设置这个连接,或者我的问题不是出在这儿的,那么又会是什么问题呢?
另外为什么我看到别人在调用 session.save或update方法时只需要flush一下就能保存,而我一定要再追加上Transaction的commit方法才行。 直接flush也不报错,但数据库里就是没有内容。
- flush和commit的关系是怎么回事?
可能是我没有查阅资料或者没有系统的学习原因吧,有没有需要系统的学习一下呢? 我现在还是入门,学会了用。 如果你没理解看下面的代码:
// stub
String name = cf.getCatName();
...
Session session = null;
try {
session = HibernateSessionFactory.getSession();
WpTerms wpt = new WpTerms(); //wp_terms表的对象。
wpt.setName(name);
...
session.save(wpt);
session.flush();
System.out.println("新目录创建成功: " + wpt.getTermId());
try {
WpTermTaxonomy wptt = new WpTermTaxonomy(); //wp_term_taxonomy表对象
wptt.setTermId(wpt.getTermId());
...
session.save(wptt);
session.flush();
request
.setAttribute("resultMessage", "目录建立成功:"
+ wpt.getName());
return mapping.findForward("createSuccess");
} catch (Exception e) {
e.printStackTrace();
request.setAttribute("errorMessage", "保存目录信息时出错,错误位置:02。");
} finally {
//就是这里,不用使用事物就保存不了,开始以为处理两个或更多表才就要用到,但一个表时也需要commit!
Transaction t = session.beginTransaction();
t.commit();
session.close();
}
} catch (Exception e) {
e.printStackTrace();
request.setAttribute("errorMessage", "保存目录信息时出错,错误位置:01。");
}
return mapping.findForward("createFailed");
最后还有个简单的问题:
<p>目录名: <html:text property="catName" />
<html:errors property="catName" /></p>
...
</html:form>
- 我用的是struts1.3,怎么从action里或其它地方给他传值呢?
