总结下在用SPRING MVC做登陆、注册、查询用户的三个功能碰到的问题吧:
1.数据库连接问题。
在控制器文件中已经配置好了数据库连接类Mysql.java,代码如下:
Mysql.java:
<span style="font-family:Microsoft YaHei;">package controller;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Mysql {
static String ip = "127.0.0.1";
static String port = "3306";
static String databaseName = "test";
static String encode = "useUnicode=true&characterEncoding=utf-8"; // 设置数据库连接为字符集较大的utf-8
static String username = "root";
static String password = "yuanshiren";
public static void main(String[] args) throws SQLException {
//String sql = "insert into user values(?, ?)";
//PreparedStatement preparedStatement = Mysql.getPreparedStatement(sql); //此为测试部分,用于测试该文件是否有效。
// preparedStatement.setString(1, "2013150006");
// preparedStatement.setString(2, "ha1");
//preparedStatement.setString(3, "jisuanji");
//preparedStatement.execute();
}
public static Connection getConn() { // 获取与数据库的连接
String url = "jdbc:mysql://" + ip + ":" + port + "/" + databaseName + "?" + encode; // 连接数据库的路径
try {
Class.forName("com.mysql.jdbc.Driver"); // 加载驱动
Connection connection = DriverManager.getConnection(url, username, password); // 创建和数据库的连接
return connection;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static PreparedStatement getPreparedStatement(String sql) { // 获取SQL操作数据库的准备
try {
return Mysql.getConn().prepareStatement(sql);
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
}</span>
PreparedStatement这个类,在后面主要能用于处理mysql语句。其次在别的控制类文件中,可以直接调用Mysql这个类文件用于连接。
2.Session问题
登陆后的Session到底怎么用呢?在spring mvc中也是一样的,直接在控制登陆的控制器文件login.java中的login()函数中加入参数HttpSession Session,通过setAttribute()设置就可以在jsp文件中使用了。
public String login(String id, String passwd,HttpSession session)
3.转发和重定向问题
return "xxx.jsp"这样的是转发,新的页面会继续处理刚刚的请求,还保存着request中的数据。
ModelAndView modelAndView = new ModelAndView("redirect:show.jsp", hashMap);这样的redirect语句是重定向。而重定向的话,当前页面会向浏览器请求新的页面,路径会发生改变。
4.model类的使用问题
这是查询用户的控制器show.java
public String show(Model model){
try{
String sql="select * from user";
PreparedStatement ps=Mysql.getPreparedStatement(sql);
ResultSet rs=ps.executeQuery();
ArrayList<HashMap<String,String>> arrayList=new ArrayList<>();
model.addAttribute("arrayList", arrayList);
HashMap<String,String> hashMap=new HashMap<>();
while(rs.next()){
String id=rs.getString("id");
String passwd=rs.getString("passwd");
hashMap.put("id",id);
hashMap.put("passwd", passwd);
arrayList.add(hashMap);
hashMap=new HashMap<>();
}
model.addAttribute("arrayList",arrayList);
return "show.jsp";
}catch(Exception e){
e.printStackTrace();
}
return "login.jsp";
}
对于SQL语句的结果是用ResultSet类型的对象来存储的。主要的函数有execute(),executeQuery()和executeUpdate()。对于查询语句,用第二个函数。
新建的resultset对象默认是指向位置0的,所以如果要判断有没有数据或者读取数据都需要把指针移动到下一位,所以有了next()。
model类的对象是可以直接在jsp文件中使用的,和session类似。是框架中特别的类型。
5.Hashmap,arraylist的使用问题
由于hashmap存储数据是key->value的形式。如果在while循环内,不重新申请hashMap对象,最后加入到arrayList中的hashmap对象都会是同一数据,以至于在show.jsp中展示的查询结果都会是n条数据库中最后一条的数据(难以理解为何如此:第一次循环数据库查询到的第一条记录放入hashmap,再添加进arrayList后。后面的循环操作由于key是一样的后来的记录将会覆盖原来的记录,但之前所保存在arrayList里的数据居然会发生变化!)