JDBC整理
22151 ワード
データベースプロファイル
dbを作成します.propertiesリソースファイル、構成情報の保存
データベース共通クラスの操作
daoパッケージを作成し、BaseDaoクラスを作成
キャラクタコーディングフィルタ
filterパッケージを作成し、パッケージの下にCharacterEncodingFilterクラスを作成します.
Webでxmlの下でコードフィルタを登録し、パスは自分の必要に応じて変更します.
エンティティ・オブジェクトの作成
pojoパッケージを作成し、データベースに基づいて対応するエンティティクラスを作成します.
userテーブルの例として、Userクラスを作成し、データベースフィールドに基づいて対応するプライベート属性を作成し、get/setメソッドを作成し、パラメトリック/無パラメトリック構築メソッドを作成します.
データベース操作エンティティークラス
userパッケージを作成し、UserDaoインタフェースを作成し、インタフェース向けにプログラミングします.
インタフェース実装クラスの作成
ビジネス層インタフェースおよび実装クラス
サービスパッケージを作成し、サービスパッケージの下にuserパッケージを作成します.
次に、UserServiceインタフェースを作成します.
インタフェース実装クラスUserServiceImplの作成
制御層実装クラス
servletパッケージを作成し、userパッケージを作成します.
ログイン要求を処理するためにuserパッケージの下にLoginServiceクラスを確立する
登録LoginService
userパッケージの下にUserServiceletクラスを作成してパスワード変更要求を処理
UserServiceletの登録
共通ツールクラスの作成
utilパッケージを作成し、共通変数ツールクラスConstantsを作成します.
以降の定数はツールクラスの下に置く
ログアウト機能の作成
アイデア:セッションを削除し、ログインページにリダイレクト
servletパッケージ内のuserパッケージ内でLogoutServiceクラスを確立する
サーブレットの登録
jspの下にlogoutを適用する.do,aラベルを例に
ログインブロックの最適化
思想:ページを要求する時、セッションが存在するかどうかを判断する
filterパッケージの下にログインフィルタSysFilterを作成する
フィルタの登録
UserServicelet最適化の詳細パスワードを検証ajaxを使用してタイムリーに動的に最適化 サーブレット多重化を実現 使用前にfastjson依存を導入
updatePwd.jspファイルは、環境に応じて異なる修正を行います
補足内容ウェルカムページとセッションの有効期限の設定 fastjson依存 パケット化状況:pojoパケット、daoパケット、userパケット、serviceパケット、servletパケット、filterパケット、utilパケット
dbを作成します.propertiesリソースファイル、構成情報の保存
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/javaweb?useSSL=true&useUnicode=true&characterEncoding=utf-8
username=root
password=123456
データベース共通クラスの操作
daoパッケージを作成し、BaseDaoクラスを作成
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class BaseDao {
private static String driver;
private static String url;
private static String username;
private static String password;
// ,
static {
Properties properties = new Properties();
//
InputStream is = BaseDao.class.getClassLoader().getResourceAsStream("db.properties");
try {
properties.load(is);
} catch (IOException e) {
e.printStackTrace();
}
driver = properties.getProperty("driver");
url = properties.getProperty("url");
username = properties.getProperty("username");
password = properties.getProperty("password");
}
//
public static Connection getConnection(){
Connection connection = null;
try {
Class.forName(driver);
connection = DriverManager.getConnection(url,username,password);
} catch (Exception e) {
e.printStackTrace();
}
return connection;
}
//
public static ResultSet execute(Connection con, PreparedStatement pre, ResultSet rs, String sql, Object[] params) throws SQLException {
rs=null;
if(con!=null){
pre = con.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
pre.setObject(i+1,params[i]);
}
rs = pre.executeQuery();
}
return rs;
}
//
public static int execute(Connection con, PreparedStatement pre, String sql, Object[] params) throws SQLException {
int updateRows = 0;
if(con!=null){
pre = con.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
pre.setObject(i+1,params[i]);
}
updateRows = pre.executeUpdate();
}
return updateRows;
}
//
public static boolean closeResource(Connection con, PreparedStatement pre, ResultSet rs){
boolean flag = true;
if(con!=null){
try{
con.close();
con = null; //GC
}catch (SQLException e){
e.printStackTrace();
flag = false;
}
}
if(pre!=null){
try {
pre.close();
pre = null;
} catch (SQLException e) {
e.printStackTrace();
flag = false;
}
}
if(rs!=null){
try {
rs.close();
rs = null;
} catch (SQLException e) {
e.printStackTrace();
flag = false;
}
}
return flag;
}
}
キャラクタコーディングフィルタ
filterパッケージを作成し、パッケージの下にCharacterEncodingFilterクラスを作成します.
import javax.servlet.*;
import java.io.IOException;
public class CharacterEncodingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");
chain.doFilter(request,response);
}
@Override
public void destroy() {}
}
Webでxmlの下でコードフィルタを登録し、パスは自分の必要に応じて変更します.
CharacterEncodingFilter
com.qiu.filter.CharacterEncodingFilter
CharacterEncodingFilter
/*
エンティティ・オブジェクトの作成
pojoパッケージを作成し、データベースに基づいて対応するエンティティクラスを作成します.
userテーブルの例として、Userクラスを作成し、データベースフィールドに基づいて対応するプライベート属性を作成し、get/setメソッドを作成し、パラメトリック/無パラメトリック構築メソッドを作成します.
データベース操作エンティティークラス
userパッケージを作成し、UserDaoインタフェースを作成し、インタフェース向けにプログラミングします.
public interface UserDao {
//
public User getLoginUser(Connection con, String username, String password) throws SQLException;
//
public int updatePwd(Connection con, String username, String password)throws SQLException;
}
インタフェース実装クラスの作成
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class UserDaoImpl implements UserDao {
//
public User getLoginUser(Connection con, String username, String password) throws SQLException {
PreparedStatement pre = null;
ResultSet rs = null;
User user = null;
if(con!=null){
String sql = "select * from user where username=? and password=?";
Object[] params = {username,password};
rs = BaseDao.execute(con, pre, rs, sql, params);
if(rs.next()){
user = new User();
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
}
BaseDao.closeResource(null,pre,rs);
}
return user;
}
//
public int updatePwd(Connection con, String username, String password) throws SQLException {
PreparedStatement pre = null;
int updateRows = 0;
if(con!=null){
String sql = "update user set password = ? where username = ?";
Object[] params = {password,username};
updateRows = BaseDao.execute(con, pre, sql, params);
BaseDao.closeResource(null, pre, null);
}
return updateRows;
}
}
ビジネス層インタフェースおよび実装クラス
サービスパッケージを作成し、サービスパッケージの下にuserパッケージを作成します.
次に、UserServiceインタフェースを作成します.
public interface UserService {
//
public User login(String username, String password);
// ID
public boolean updatePwd(String username, String password);
}
インタフェース実装クラスUserServiceImplの作成
public class UserServiceImpl implements UserService {
// dao , dao
private UserDao userDao;
public UserServiceImpl(){
userDao = new UserDaoImpl();
}
@Override
public User login(String username, String password) {
Connection con = null;
User user = null;
con = BaseDao.getConnection();
//
try {
user = userDao.getLoginUser(con,username,password);
} catch (SQLException e) {
e.printStackTrace();
}finally {
BaseDao.closeResource(con,null,null);
}
return user;
}
@Override
public boolean updatePwd(String username, String password){
Connection con = null;
boolean flag = false;
// ID
try{
con = BaseDao.getConnection();
if(userDao.updatePwd(con, username, password)>0){
flag=true;
}
}catch (SQLException e){
e.printStackTrace();
try {
con.rollback();//
} catch (SQLException ex) { ex.printStackTrace(); }
}finally {
BaseDao.closeResource(con,null,null);
}
return flag;
}
}
制御層実装クラス
servletパッケージを作成し、userパッケージを作成します.
ログイン要求を処理するためにuserパッケージの下にLoginServiceクラスを確立する
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//
String username = req.getParameter("username");
String password = req.getParameter("password");
// ,
UserService userService = new UserServiceImpl();
User user = userService.login(username, password);
if(user!=null){
// Session
req.getSession().setAttribute(Constants.USER_SESSION,user);
//
resp.sendRedirect(req.getContextPath()+"/main/success.jsp");
}else{
// , ,
req.setAttribute(Constants.MESSAGE," ");
req.getRequestDispatcher("/login/login.jsp").forward(req,resp);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
登録LoginService
login
com.qiu.servlet.user.LoginServlet
login
/login.do
userパッケージの下にUserServiceletクラスを作成してパスワード変更要求を処理
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class UserServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// Session username
Object obj = req.getSession().getAttribute(Constants.USER_SESSION);
String newpassword = req.getParameter("newpassword");
boolean flag = true;
if(obj!=null && !StringUtils.isNullOrEmpty(newpassword)){
UserService userService = new UserServiceImpl();
flag = userService.updatePwd(((User)obj).getUsername(),newpassword);
if(flag){
req.setAttribute(Constants.MESSAGE," , ");
req.getSession().removeAttribute(Constants.USER_SESSION);
}else{
req.setAttribute(Constants.MESSAGE," ");
}
}else{
req.setAttribute(Constants.MESSAGE," ");
}
req.getRequestDispatcher("/main/updatePwd.jsp").forward(req,resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
UserServiceletの登録
UserServlet
com.qiu.servlet.user.UserServlet
UserServlet
/main/user.do
共通ツールクラスの作成
utilパッケージを作成し、共通変数ツールクラスConstantsを作成します.
以降の定数はツールクラスの下に置く
public class Constants {
public final static String USER_SESSION = "userSession";
public final static String MESSAGE = "message";
}
ログアウト機能の作成
アイデア:セッションを削除し、ログインページにリダイレクト
servletパッケージ内のuserパッケージ内でLogoutServiceクラスを確立する
public class LogoutServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// Constants.USER_SESSION
req.getSession().removeAttribute(Constants.USER_SESSION);
resp.sendRedirect(req.getContextPath()+"/login/login.jsp");//
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
サーブレットの登録
logout
com.qiu.servlet.user.LogoutServlet
logout
/logout.do
jspの下にlogoutを適用する.do,aラベルを例に
">
ログインブロックの最適化
思想:ページを要求する時、セッションが存在するかどうかを判断する
filterパッケージの下にログインフィルタSysFilterを作成する
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class SysFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
// , Session
User user = (User) request.getSession().getAttribute(Constants.USER_SESSION);
if(user==null){ // ,
response.sendRedirect(request.getContextPath()+"/login/login.jsp");
}else {
chain.doFilter(req, resp);
}
}
@Override
public void destroy() {}
}
フィルタの登録
SysFilter
com.qiu.filter.SysFilter
SysFilter
/main/*
UserServicelet最適化の詳細
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
// Servlet
public class UserServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method = req.getParameter("method");
if(method!=null && method.equals("savepwd")){
this.updataPwd(req,resp);
}else if(method!=null && method.equals("pwdmodify")){
this.pwdModify(req,resp);
}
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
//
public void updataPwd(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// Session username
Object obj = req.getSession().getAttribute(Constants.USER_SESSION);
String newpassword = req.getParameter("newpassword");
boolean flag;
if(obj!=null && !StringUtils.isNullOrEmpty(newpassword)){
UserService userService = new UserServiceImpl();
flag = userService.updatePwd(((User)obj).getUsername(),newpassword);
if(flag){
req.setAttribute(Constants.MESSAGE," , ");
req.getSession().removeAttribute(Constants.USER_SESSION);
}else{
req.setAttribute(Constants.MESSAGE," ");
}
}else{
req.setAttribute(Constants.MESSAGE," ");
}
req.getRequestDispatcher("/main/updatePwd.jsp").forward(req,resp);
}
// ,session
public void pwdModify(HttpServletRequest req, HttpServletResponse resp) throws IOException {
Object obj = req.getSession().getAttribute(Constants.USER_SESSION);
String oldpassword = req.getParameter("oldpassword");
// Map:
Map resultMap = new HashMap();
if(obj==null){//session
resultMap.put("result","sessionError");
}else if(StringUtils.isNullOrEmpty(oldpassword)){ //
resultMap.put("result","error");
}else{
String userPassword = ((User)obj).getPassword();
if(oldpassword.equals(userPassword)){
resultMap.put("result","true");
}else{
resultMap.put("result","false");
}
}
resp.setContentType("application/json");
PrintWriter writer = resp.getWriter();
//JSONArray JSON ,
writer.write(JSONArray.toJSONString(resultMap));
writer.flush();
writer.checkError();
}
}
updatePwd.jspファイルは、環境に応じて異なる修正を行います
${message}
let oldpassword = null;
let newpassword = null;
let rnewpassword = null;
let saveBtn = null;
let message = null;
let path = "${pageContext.request.contextPath}";
$(function () {
oldpassword = $("#oldpassword");
newpassword = $("#newpassword");
rnewpassword = $("#rnewpassword");
saveBtn = $("#save");
message = $("#message");
oldpassword.on("focus",function (){
message.html(" !");
}).on("blur",function () {
$.ajax({
type:"GET",
url:path+"/main/user.do",
data:{method:"pwdmodify",oldpassword:oldpassword.val()},
// path+"/main/user.do?method=pwdmodify&oldpassword=oldpassword.val()"
dataType:"json",
success:function (data) {
if(data.result === "true"){ //
message.html(" !");
}else if(data.result ==="false"){
message.html(" !");
}else if(data.result ==="sessionError"){
message.html(" session , !");
}else if(data.result ==="error"){
message.html(" !");
}
},
error:function (data) {
//
message.html(" !");
}
});
});
//
newpassword.on("focus",function () {
message.html(" 6 20 !");
}).on("blur",function () {
if(newpassword.val()!=null && newpassword.val().length>=6
&& newpassword.val().length<20){
message.html(" !");
}else{
message.html(" , ");
}
});
//
rnewpassword.on("focus",function () {
message.html(" ");
}).on("blur",function () {
if(newpassword.val()!=null && newpassword.val().length>=6
&& newpassword.val().length<20 && newpassword.val() === rnewpassword.val()){
message.html(" !");
}else{
message.html(" , !");
}
});
});
function send(){
if(message.html()===" , " || (oldpassword.val().length!==0 && newpassword.val().length!==0 && rnewpassword.val().length!==0)){
document.getElementsByClassName("update-form")[0].submit();
}else{
message.html(" , !");
}
}
補足内容
/login/login.jsp
30
com.alibaba
fastjson
1.2.62