實作用戶注冊功能
要求: 用戶通過HTML網頁輸入注冊資訊,用戶名、密碼、郵箱、性別
? 當用戶點擊提交按鈕時,把注冊資訊保存到資料庫t_user 表中
技術: HTML 撰寫表單
? servlet 接收用戶提交的請求資訊,并操作資料庫,
? jdbc 訪問資料庫
? MySQL 資料庫
步驟: HTML表單接收用戶輸入注冊資訊,
? 提交請求到服務器端程式(servlet)
? servlet接收用戶的請求資訊
? 通過jdbc完成資料插入(insert) 操作,
功能實作
-
創建工程
創建動態web工程
-
撰寫網頁
? 工程的目錄結構
?
src目錄 , 用來存放所有的java源檔案,?
webContent目錄, 是web工程的根目錄,HTML網頁檔案要存放在這個目錄下,? 創建register.html 檔案
? 撰寫注冊表單
-
搭建服務器
? 通過服務器發布web應用,使用戶都可以訪問服務器上發布的工程,
? 配置Tomcat:環境變數中已經配置了JAVA_HOME.
? TOMCAT環境變數: CATALINA_HOME
在eclipse中配置Tomcat服務器
為web工程添加Tomcat的環境
在servers視圖中添加服務器
配置工程發布的路徑
發布工程
通過瀏覽器訪問web工程下的頁面
-
問題解決
? 修改Tomcat服務器默認的埠號
? Tomcat安裝目錄下
conf目錄 下server.xml?
index.html為當前web工程的默認主頁面 -
在服務器端處理用戶請求
?
servlet處理用戶請求,并為用戶生成回應頁面,? 什么是
servlet??
servlet是運行在服務器端的一個java類?
servlet的運行必須依賴servlet容器,Tomcat服務器本身就是一個servlet運行環境,?
servlet的作用?? 生成動態的回應資訊,
? 創建
servlet -
使用servlet接收表單資訊
通過表單向servlet發送請求,使用form標簽的action屬性
在servlet中接收用戶資訊
? 使用request物件接收請求引數
?
String userName = request.getParameter("userName");如果表單中沒有填寫資料,對應的請求引數的值為“”空字串
getParameter方法只能接收到請求引數的一個值,如果請求引數中包含了多個值(復選框),要使用getParameterValues方法來進行獲取,該方法的回傳值為一個String陣列物件,String[] likes = request.getParameterValues("likes");
JDBC 資料庫訪問
? java中提供了一個java.sql包,定義了java操作資料庫的規范,存在大量的介面,
? 資料庫廠商遵循規范,定義資料庫訪問的驅動包,
步驟:
-
在工程中匯入資料庫連接的jar包,
-
加載驅動類
-
創建資料庫連接
注意: 在JDBC的程式中,引包時,必須引入的是java.sql包中的資源,
-
創建SQL陳述句的載體物件
?
PreparedStatement預編譯SQL陳述句載體物件? 提高SQL陳述句執行的效率
? 通過使用?占位符的方式,來動態處理SQL陳述句的內容,
-
? 提交SQL陳述句
? 如果提交的是查詢陳述句,使用方法是executeQuery
? 回傳值為結果集物件ResultSet,這個物件封裝了查詢結果集,
? 如果提交的是增刪改陳述句,使用方法是executeUpdate
-
處理結果
? 如果是查詢陳述句,需要處理resultSet物件,來獲得所有的查詢結果資料,
-
關閉資源 先打開的資源后關
單元測驗工具Junit
? 撰寫獨立運行的測驗方法,
? 在工程中匯入jar包,
? 測驗方法的定義: 由public修飾沒有回傳值型別,沒有引數,為測驗方法添加@Test注解
?
@Test
public void testInsert() throws Exception {
System.out.println("插入用戶");
}
?
三層體系架構
? 什么樣的軟體系統是好的系統?
? 軟體系統的可維護性和可擴展性, 耦合度低,
? 解耦,根據系統的功能進行分層,不同功能的代碼定義在不同的類中,
? 軟體系統分幾層:3層
? 表示層 : 和用戶進行互動 springMVC、struts2
? 頁面和servlet組成
? 業務層 : 業務邏輯 spring
? 資料持久層 dao: 操作資料庫(JDBC)mybatis、hibernate.
? 定義物體類pojo,domain,entity,
? 一個物體類對應資料庫中的一張表,
? 表的欄位對應類的屬性,
? 下層要為上層提供操作介面,下層不能訪問上一層,不要跨層訪問,
? ssm ssh框架
用戶管理系統
創建工程的目錄結構
撰寫controller
?
package com.neuedu.user.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.neuedu.user.pojo.User;
import com.neuedu.user.service.UserService;
import com.neuedu.user.service.impl.UserServiceImpl;
/**
* 實作注冊功能
*/
@WebServlet("/RegisterServlet")
public class RegisterServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String loginName = request.getParameter("loginName");
String password = request.getParameter("password");
String email = request.getParameter("email");
int sex = Integer.parseInt(request.getParameter("sex"));
User user = new User();
user.setLoginName(loginName);
user.setPassword(password);
user.setEmail(email);
user.setSex(sex);
// 呼叫業務層service
UserService userService = new UserServiceImpl();
int temp = userService.register(user);
if(temp > 0) {
System.out.println("注冊成功");
}else {
System.out.println("注冊失敗");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
撰寫service
package com.neuedu.user.service.impl;
import com.neuedu.user.dao.UserDao;
import com.neuedu.user.dao.impl.UserDaoImpl;
import com.neuedu.user.pojo.User;
import com.neuedu.user.service.UserService;
public class UserServiceImpl implements UserService {
@Override
public int register(User user) {
// 呼叫DAO
UserDao userDao = new UserDaoImpl();
int temp = 0;
try {
temp = userDao.register(user);
} catch (Exception e) {
e.printStackTrace();
}
return temp;
}
}
撰寫dao
?
package com.neuedu.user.dao.impl;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import com.neuedu.user.dao.UserDao;
import com.neuedu.user.pojo.User;
public class UserDaoImpl implements UserDao {
@Override
public int register(User user) throws Exception{
String sql = "insert into t_user (loginName,password,email,sex) values (?,?,?,?)";
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mytest",
"root", "root");
PreparedStatement ps = conn.prepareStatement(sql);
//設定占位符
ps.setString(1, user.getLoginName());
ps.setString(2, user.getPassword());
ps.setString(3, user.getEmail());
ps.setInt(4, user.getSex());
//提交SQL陳述句
int temp = ps.executeUpdate();
ps.close();
conn.close();
return temp;
}
}
頁面跳轉
當用戶注冊成功后,頁面要跳轉到登錄頁面,
如果注冊失敗,頁面要回傳注冊頁面,并顯示失敗資訊,
兩種頁面跳轉方式的區別:
請求轉發
? 處于轉發程序中的資源,屬于同一個web工程
? 轉發存在一次請求
? 地址欄不會發生改變
? 可以通過request物件共享資料
請求重定向
? 處于重定向程序中的資源,可以不屬于同一個web工程
? 重定向存在兩次請求
? 地址欄會發生改變
? 通過session物件共享資料
登錄功能
? login.html
?
<form action="/usermanager/LoginServlet" method="post">
用戶名:<input type="text" name="loginName"><br/>
密碼:<input type="password" name="password"><br/>
<input type="submit">
<input type="reset">
</form>
? LoginServlet
?
package com.neuedu.user.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.neuedu.user.service.UserService;
import com.neuedu.user.service.impl.UserServiceImpl;
/**
* 登錄servlet
*/
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//接收資料
String loginName = request.getParameter("loginName");
String password = request.getParameter("password");
UserService userService = new UserServiceImpl();
//呼叫service
boolean flag = userService.login(loginName, password);
//頁面跳轉
if(flag) {
//登錄成功,跳轉到主頁面,轉發
request.getRequestDispatcher("/list.html").forward(request, response);
}else {
//登錄失敗,跳轉到登錄頁面,重定向
response.sendRedirect("/usermanager/login.html");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
? UserService介面
? UserServiceImpl介面實作類
@Override
public boolean login(String loginName, String password) {
//呼叫DAO
UserDao userDao = new UserDaoImpl();
return userDao.login(loginName, password);
}
? UserDao介面
? UserDaoImpl 介面實作類
? 簡化DAO層開發:抽取出jdbc的工具類,
? 工具類做什么?
? Class.forName
? 獲得連接物件
? 關閉資源
? 創建DBUtil 資料庫訪問工具類,
? 通常工具類中的方法都是靜態方法,
? 靜態代碼塊:在類被加載到記憶體中時被執行,而且只執行一次,
package com.neuedu.user.utils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DBUtil {
private static String url = "jdbc:mysql://localhost:3306/mytest";
private static String user = "root";
private static String password = "root";
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//獲得連接物件
public static Connection getConnection() {
Connection conn = null;
try {
conn = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
//關閉資源
public static void close(ResultSet rs) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(Statement stat) {
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(Connection conn) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
? User pojo類
? 登錄失敗后,回傳登錄頁面,并在登錄頁面中為用戶顯示失敗資訊,
? 網頁根據不同情況,顯示不同的內容,動態網頁,使用jsp來實作動態網頁,
? java server page
? 創建一個jsp檔案,
? 處理登錄失敗的提示資訊,
? 該資訊應該在登錄失敗時生產,
? 在LoginServlet中登錄失敗時,要生成一個提示資訊,
? servlet要把提示資訊交給jsp,進行展示,
? 此時要使用web資源之間的資料傳遞,要使用共享作用域物件,
? pageContext 一個頁面
? request 一次請求
? session 一次會話(包含多次請求)
? application (ServletContext) web工程下所有的資源都可以使用,ServletContext物件的宣告周期和服務器的生命周期同步,
? 在請求物件中,添加共享資料
?
request.setAttribute("message", msg);//添加屬性
request.getAttribute("message");//獲取屬性
request.removeAttribute("message");//洗掉屬性
?
向上轉型(上溯造型)
UserDao userDao = new UserDaoImpl();
宣告參考時使用的是介面(父型別),創建物件時,創建的是實作類(子類)的物件,
把子類的物件賦值給父類的參考,
double d = 10; 自動型別轉換
class Dog extends Animal {}
Animal an = new Dog();
介面
? 介面由interface關鍵字宣告
? 介面中定義屬性 ,默認由public static final 修飾
? 介面中定義方法, 默認由public abstract 修飾
? 介面定義的是規范,其實作類必須遵循規范,
撰寫dao中的方法
? register 方法注冊 插入
? login 方法登錄 查詢
? 查詢所有用戶資訊 List<User> findUserAll()
? 按id查詢用戶資訊 User findUserById(int id)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/376835.html
標籤:Java
