這些天想把這幾個框架整合一下,寫下來記錄一下,備忘!
因爲很久沒用過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);