(菜鳥來動手)SpringMVC+Spring+Mybatis整合(第一天) 沒有框架的時候

這些天想把這幾個框架整合一下,寫下來記錄一下,備忘!

因爲很久沒用過struts和hibernate了,而且個人感覺springMVC和Mybatis更方便.所以就整合一下這個!


第一天,我們先把沒有框架時候的樣子先做出來!

項目暫時就是一個學生登錄,增刪改查.整個項目分層爲三層, action,servers,dao 層.目錄如下圖:


第一天實現一個很簡單的功能:輸入用戶名密碼,正確的話跳轉到 查詢列表頁面,錯誤的話還是當前頁面.

1.先定義model類

package com.sky.ssm.alpha.model;

/**
 * 學生實體類
* @author: admin
 */
public class Student {
	private int id;
	private String name;
	private String password;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
}

2.再來個數據庫連接的類

package com.sky.ssm.alpha.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DataBase {
	/**
	 * 得到數據庫連接
	 * @return
	 */
	public static Connection getConn(){
		Connection conn = null;
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","tomcat","tomcat");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}
	/**
	 * 得到一個stat
	 * @param conn
	 * @return
	 */
	public static Statement getStat(Connection conn){
		Statement stat = null;
		try {
			stat = conn.createStatement();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return stat;
	}
	
	/**
	 * 得到一個Pstat
	 * @param conn
	 * @param sql
	 * @return
	 */
	public static PreparedStatement preparStat(Connection conn,String sql){
		PreparedStatement pstat = null;
		try {
			pstat = conn.prepareStatement(sql);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return pstat;
		
	}
	
	/**
	 * 執行一條查詢SQL語句
	 * @param stat
	 * @param sql
	 * @return
	 */
	public static ResultSet executeQuery(Statement stat,String sql){
		ResultSet rs = null;
		try {
			rs = stat.executeQuery(sql);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return rs;
	}
	/**
	 * 執行一條更新SQL語句
	 * @param conn
	 * @param sql
	 * @return
	 */
	public static int executeUpdate(Connection conn,String sql){
		int res=0;
		Statement stat = null;
		try {
			stat= conn.createStatement();
			res=stat.executeUpdate(sql);
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			close(stat);
		}
		return res;
	}
	
	/**
	 * 關閉連接
	 * @param conn
	 */
	public static void close(Connection conn){
		try {
			if (conn!=null){
				conn.close();
				conn=null;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	/**
	 * 關閉連接
	 * @param conn
	 */
	public static void close(Statement stat){
		try {
			if (stat!=null){
				stat.close();
				stat=null;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	/**
	 * 關閉連接
	 * @param conn
	 */
	public static void close(ResultSet rs){
		try {
			if (rs!=null){
				rs.close();
				rs=null;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

3. 再來定義dao的實現(dao接口裏面就個方法名,就不貼了)

package com.sky.ssm.alpha.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.sky.ssm.alpha.dao.StudentDAO;
import com.sky.ssm.alpha.model.Student;
import com.sky.ssm.alpha.util.DataBase;

public class StudentDAOImpl implements StudentDAO {

	@Override
	public Student getByNameAndPWD(String name,String password) throws SQLException {
		Connection conn = DataBase.getConn();
		String sql = "select id,name,sex from student where name = ? and password = ? ";
		PreparedStatement pstmt = DataBase.preparStat(conn,sql);
		pstmt.setString(1, name);
		pstmt.setString(2, password);
		ResultSet rs = pstmt.executeQuery();
		Student s = null;
		while(rs.next()){//沒考慮多個的情況
			s = new Student();
			s.setId(rs.getInt(1));
			s.setName(rs.getString(2));
			s.setPassword(rs.getString(3));
		}
		DataBase.close(rs);
		DataBase.close(pstmt);
		DataBase.close(conn);
		return s;
	}

	@Override
	public List<Student> listAll() throws SQLException {
		Connection conn = DataBase.getConn();
		String sql = "select id,name,sex from student ";
		PreparedStatement pstmt = DataBase.preparStat(conn,sql);
		ResultSet rs = pstmt.executeQuery();
		List<Student> list = new ArrayList<Student>();
		while(rs.next()){
			Student s = new Student();
			s.setId(rs.getInt(1));
			s.setName(rs.getString(2));
			s.setPassword(rs.getString(3));
			list.add(s);
		}
		DataBase.close(rs);
		DataBase.close(pstmt);
		DataBase.close(conn);
		return list;
	}
	
}

4. 再來servers的實現

package com.sky.ssm.alpha.service.impl;

import java.sql.SQLException;
import java.util.List;

import com.sky.ssm.alpha.dao.StudentDAO;
import com.sky.ssm.alpha.dao.impl.StudentDAOImpl;
import com.sky.ssm.alpha.model.Student;
import com.sky.ssm.alpha.service.StudentManager;

public class StudentManagerImpl implements StudentManager {
	private StudentDAO studentDao = new StudentDAOImpl();;

	@Override
	public Student getByNameAndPWD(String name,String password) throws SQLException {
		return this.studentDao.getByNameAndPWD(name,password);
	}
	@Override
	public List<Student> listAll() throws SQLException {
		return this.studentDao.listAll();
	} 
	public static void main(String[] args) throws SQLException{
		StudentManagerImpl manager = new StudentManagerImpl();
		Student s = manager.getByNameAndPWD("張三","111111");
		if(s!=null){
			System.out.println(s.getId());
		}
	}
}

5.再來action

package com.sky.ssm.alpha.web;

import java.io.IOException;
import java.sql.SQLException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.sky.ssm.alpha.model.Student;
import com.sky.ssm.alpha.service.StudentManager;
import com.sky.ssm.alpha.service.impl.StudentManagerImpl;

public class StudentController extends HttpServlet{
	
	private static final long serialVersionUID = -1926093434079865212L;
	private StudentManager manager ; 
	
	@Override
	 public void doPost(HttpServletRequest req, HttpServletResponse resp)
	   throws ServletException, IOException {
		 manager = new StudentManagerImpl();
		 String name = req.getParameter("name");
		 String password = req.getParameter("password");
		 Student s = null;
		try {
			s = manager.getByNameAndPWD(name, password);
			if(s!=null){
				List<Student> list = manager.listAll();
				req.setAttribute("list", list);
				req.getRequestDispatcher("student/list.jsp").forward(req, resp); 
				return;
			}else{
				resp.sendRedirect("login.jsp?msg=name or password error !!");
				return;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
	 }
	 @Override
	 public void doGet(HttpServletRequest req, HttpServletResponse resp)
	   throws ServletException, IOException {
		 doPost(req,resp);
	 }		 
}

6. 登錄的jsp頁面

<%@ page language="java" contentType="text/html; charset=GBK"
	pageEncoding="GBK"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>登錄</title>
</head>
<body>
    <form action="login" method="post">
    username:<input type="text" name="name"><br>
    password:<input type="password" name="password"><br>
    <% 
    	if(request.getParameter("msg")!=null){ 
    	%>
    	<td><%= request.getParameter("msg") %></br ></td>
    <% } %>
    <input type="submit">
    </form>
  </body>
</html>

7.查詢列表的jsp頁面

<%@ page language="java" contentType="text/html; charset=GBK"
	pageEncoding="GBK"%>
<%@ page import="java.util.*" %>
<%@page import="com.sky.ssm.alpha.model.Student"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<% 
	List<Student> list = (List<Student>)request.getAttribute("list");
	System.out.println(list.get(0).getName());
%>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>列表</title>
</head>
<body>
	<%	
		for(int i=0;i<list.size();i++){
	%>
		<td>
			<%= list.get(i).getName() %>
			</br>	
		</td>
	<%		
		}
	%>
  </body>
</html>

8.web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>cpmis</display-name>
  <welcome-file-list>
    <welcome-file>login.jsp</welcome-file>
  </welcome-file-list>
  
  <servlet>
     <description>login</description>
     <display-name>login</display-name>
       <servlet-name>stundentController</servlet-name>
     <servlet-class>com.sky.ssm.alpha.web.StudentController</servlet-class>
   </servlet>
   <servlet-mapping>
     <servlet-name>stundentController</servlet-name>
     <url-pattern>/login</url-pattern>
   </servlet-mapping>
</web-app>

代碼非常簡單.不過搞了半天才搞出來.有不用框架的不習慣,更多的是基礎薄弱的原因.

中間遇到的問題,記錄一下.

1.我在StudentManagerImpl 裏面寫了個main方法,但是運行不通過. 報錯好像是java.lang.UnsupportedClassVersionError


經查是JDK版本不一致的問題.,從下面幾個地方開始排查

1) window-->preferences-->java-->compilercompiler compliance level:1.6

2) window-->preferences-->java-->installed JREs本地1.6的

3) window-->preferences-->server-->runtime environments-->選擇對應的server-->edit-->JRE 本地1.6的 (這個是tomcat的,和main方法沒關係)

4)右鍵項目-->build path-->configure build path-->libraries選項卡,發現裏面JRE System library 1.7 (unbound)  

選中,edit-->alternate JRE--> 選擇本地1.6(運行main方法,還是報錯!!!)

5)右鍵項目-->properties-->project facets-->java 1.7修改爲1.6    (OK,運行成功!)


2.項目部署到tomcat後,啓動tomcat,控制檯正常啓動. 

1)訪問 http://localhost:8080  報錯404 , 

2)訪問 http://localhost:8080/alpha  報錯404

3)訪問 http://localhost:8080/alpha/login.jsp  報錯404

經查, 是因爲 tomcat(用的eclipse裏面的,server local在workspace裏面) 下面沒有默認的那幾個頁面(index.html 等等) 導致問題1).

問題2,3 都是因爲 login.jsp 當時是放在 WEB-INF 文件夾下造成的.

3.登錄成功後,到list頁面,出現亂碼.

發現 list頁面的title也是亂碼, 將 login.jsp中的from表單提交,修改爲post方法提交, action中,使用post方法處理,得到解決!


4.登錄不成功,返回登錄頁面,提示信息亂碼. (提示信息爲中文時)

解決辦法, 用forward不亂碼. 使用 redirect時, redirect前,先抓馬,jsp頁面直接get就可以.

String str = java.net.URLEncoder.encode("用戶名或密碼錯誤","GBK");
resp.sendRedirect("login.jsp?msg=" + str);





發佈了41 篇原創文章 · 獲贊 44 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章