使用JFinal结合百度BAE的云环境(Jetty)、云数据库(MYSQL)进行开发网站。
1.申请百度开发者账号,登录百度开发者中心。
2.在百度开发者管理中心的管理面板中,快速创建应用,新建一个WEB网站。
接着填写应用的信息
创建成功后:
API KEY和Secret Key在后面的百度云数据库配置时会用到。
然后在环境中配置网站的运行环境:
选择确定。然后选择创建应用的版本。
创建成功后。
红色部分为SVN的地址,复制这个地址到Eclipse中check工程到本地。
用户名和密码,为你的百度开发者账号和密码。
Finish后,工程建好后的结构:
加入如下的包:
把包添加到工程中:
看到工程里面有错误,引入关联Jetty的包中的类。
3.整个工程是不能运行在Tomcat中的,可以对工程进行配置适合Tomcat的工程结构,具体怎么配置的自己去做尝试。
但是工程是可以使用Jetty运行的,在前面引入了Jetty,测试就用Jetty作为应用服务器进行测试,方便。
4.配置JFinal到工程里面。
4.1.建立JFinal的config类BaeConfig。
package com.baetest.config;
import com.baetest.control.Index;
import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.core.JFinal;
public class BaeConfig extends JFinalConfig{
@Override
public void configConstant(Constants me) {
me.setViewType(ViewType.JSP);
}
@Override
public void configRoute(Routes me) {
me.add("/",Index.class);
}
@Override
public void configPlugin(Plugins me) {
}
@Override
public void configInterceptor(Interceptors me) {
}
@Override
public void configHandler(Handlers me) {
}
public static void main(String[] args) {
JFinal.start("WebRoot", 80, "/", 5);
}
}
4.2.建立Control类Index
package com.baetest.control;
import com.jfinal.core.Controller;
public class Index extends Controller {
public void index() {
System.out.println("Hello BAE with JFianl");
}
}
4.4.在web.xml中配置JFinal的过滤器。
<!-- Jfinal的过滤器 -->
<filter>
<filter-name>jfinal</filter-name>
<filter-class>com.jfinal.core.JFinalFilter</filter-class>
<init-param>
<param-name>configClass</param-name>
<param-value>com.baetest.config.BaeConfig</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>jfinal</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4.5.做完上面的操作过后,就可以运行了。在BaeConfig中Run Application运行Jetty进行测试。
运行结果:
5.上面运行成功后,下面进行百度云数据库的配置使用。由于BAE,不允许用户获取固定的数据库地址,因此BAE提供了动态获取数据库连接的方式。
5.1.去百度BAE下载动态获取云数据库的连接的Demo网页
<%@ page language="java" import="java.util.*,java.net.URL,java.sql.*,com.baidu.bae.api.util.BaeEnv" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Hello World</title>
</head>
<body>
<%
//(1)指定服务地址,其中dbname需要自己修改
//String dbUrl = "jdbc:mysql://sqld.duapp.com:4050/dbname";
//(2)直接从请求header中获取ip、端口、用户名和密码信息
//String host = request.getHeader("BAE_ENV_ADDR_SQL_IP");
//String port = request.getHeader("BAE_ENV_ADDR_SQL_PORT");
//String username = request.getHeader("BAE_ENV_AK");
//String password = request.getHeader("BAE_ENV_SK");
//(3)从线程变量BaeEnv接口获取ip、端口、用户名和密码信息
String host = BaeEnv.getBaeHeader(BaeEnv.BAE_ENV_ADDR_SQL_IP);
String port = BaeEnv.getBaeHeader(BaeEnv.BAE_ENV_ADDR_SQL_PORT);
String username = BaeEnv.getBaeHeader(BaeEnv.BAE_ENV_AK);
String password = BaeEnv.getBaeHeader(BaeEnv.BAE_ENV_SK);
String driverName = "com.mysql.jdbc.Driver";
String dbUrl = "jdbc:mysql://";
String serverName = host + ":" + port + "/";
%>
<%=serverName%>
</body>
</html>
将上面的网页代码放入到工程目录下。网页有代码引用错误,不管它,BAE环境中有这些类,会被引用的。只是在本地不能运行。
5.2.将整个工程代码通过SVN提交到BAE环境中。通过配置的url绝对路径访问bae.jsp的页面。结果如图:
复制打印的这个地址到下面代码中
5.3.在BaeConfig这个类中的public void configPlugin(Plugins me)方法中加入数据库连接配置。
上面的,在使用C3PO时,总是出现无法找到数据库的异常。因此只有直接使用Mysql提供的数据库源类。我是参考这篇文章的方法:
http://note.youdao.com/share/?id=72f1b9e0d3b97c5c0a62503a750e5cf5&type=note
5.4.在云数据库中添加一个测试的表格,并且在代码中建好Model。
5.5.在Index类中使用新建的Model
package com.baetest.control;
import java.util.List;
import com.baetest.model.Test;
import com.jfinal.core.Controller;
public class Index extends Controller {
public void index() {
List<Test> testList = new Test().all();
renderJson(testList);
}
}
5.6.提交代码到BAE上,进行测试,会出现异常或者是无法访问,到BAE的环境中查看运行的日志就会找到原因。
查看日志:
出现的日志:
初步判断应该是日志出现问题了,后来我在百度的文档中发现BAE有自己日志,好像是使用JDK自带的日志。下载百度的日志包log4j-adapter-1.0.0.jar
加入日志的代码:
package com.baidu.bae.api.baelog;
import org.apache.log4j.WriterAppender;
public class BaeAppender extends WriterAppender {
}
将代码提交到BAE,再次打开地址测试:
运行成功,偶也,你也可以试试,百度的BAE做的还是挺不错的。
再把这个工程的代码结构截图贴出来