Web MVC和JDBC API 实现数据转发和保存
详细内容省略很多,重要回顾原始用法
- 通过自研 Web MVC 框架实现(可以自己实现)一个用户
注册,orward 到一个成功的页面(JSP 用法) - 用户新增到数据库
- 什么是JNDI
用户注册
- 用户注册界面:index.jsp
```jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<head>
<jsp:directive.include
file="/WEB-INF/jsp/prelude/include-head-meta.jspf" />
<title>My Home Page</title>
<base href="<%=basePath%>">
</head>
<body>
<center>
<form action="<%=basePath%>user/register" method="post" >
<table border="1px" width="438px" >
<tr align="center">
<td>用户名</td>
<td>
<input type="text" name="username" >
</td>
</tr>
<tr align="center">
<td>密码</td>
<td>
<input type="password" name="password" >
</td>
</tr>
<tr align="center">
<td colspan="2" >
<input type="submit" value="用户登录" >
<input type="reset" value="重置内容" >
</td>
</tr>
</table>
</form>
</center>
</body>
```
- 新建类:UserRegisterController
```java
@POST
@Path("/register")
public String execute(HttpServletRequest request,HttpServletResponse response) throws Throwable{
DBConnectionManager instance = DBConnectionManager.getInstance();
Connection connection = instance.getConnection();
Class.forName("org.geektimes.projects.user.repository.UserRepository");
User user = new User();
user.setName(request.getParameter("username"));
user.setPassword(request.getParameter("password"));
user.setEmail("2345624tg");
user.setPhoneNumber("1927348745967");
new DatabaseUserRepository(instance).save(user);
return "index_success.jsp";
}
```
- 在DBConnectionManager单例初始化,及初始化connection对象,并放入缓存,
```java
static{
try {
Class.forName("com.mysql.jdbc.Driver");
String databaseURL = "jdbc:mysql://114.67.171.251:3341/hmily_order?useUnicode=true&characterEncoding=utf8";
Connection connection = DriverManager.getConnection(databaseURL,"root","123456");
setConnection(connection);
connectionMap.putIfAbsent("connectionMysql",connection);
typeMethodMappings.put(Long.class,"getLong");
typeMethodMappings.put(String.class,"getString");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
private DBConnectionManager(){
}
private static volatile DBConnectionManager instance = null;
//懒加载线程安全 ,避免jvm的指令重排序功能,
//同时两个判空处理
public static DBConnectionManager getInstance(){
if (instance == null) {
synchronized (DBConnectionManager.class) {
if (instance == null) {
instance = new DBConnectionManager();
}
}
}
return instance;
}
用户新增到数据库
```java
@Override
public boolean save(User user){
try {
Connection connection = getConnection();
// 新增 users 表
PreparedStatement statement = connection.prepareStatement(INSERT_USER_DML_SQL);
statement.setString(1,user.getName());
statement.setString(2,user.getPassword());
statement.setString(3,user.getEmail());
statement.setString(4,user.getPhoneNumber());
System.out.println(statement.executeUpdate());
} catch (SQLException e) {
}
```
- 用户注册成功跳转界面
JNDI 的方式获取数据库源(DataSource在获取 Connection
- 什么时JDNI
命名:,就是将Java对象以某个名称的形式绑定(binding)到一个容器环境(Context)中,以后调用容器环境(Context)的查找(lookup)方法又可以查找出某个名称所绑定的Java对象
一个对象如果它在另外一个地方(可能与当前运行的程序不在同一个 VM / 同一进程中), 对象怎么可能从一个 VM 中发送到另外一个 VM 中呢?
有一个对象上次已经保存了状态,现在服务器重启了,上次的对象肯定不在内存里面,我们怎么恢复上次的状态呢?例如,Tomcat服务器在启动时可以创建一个连接到某种数据库系统的数据源(DataSource)对象,
并将该数据源(DataSource)对象绑定到JNDI环境中,以后在这个Tomcat服务器中运行的Servlet和JSP程序就可以从JNDI环境中查询出这个数据源(DataSource)对象进行使用,
而不用关心数据源(DataSource)对象是如何创建出来的,这种方式极大地增强了系统的可维护性,当数据库系统的连接参数发生变更时,
这只是Tomcat系统管理员一个人要关心的事情,而与所有的应用程序开发人员无关