基於IDEA的bs三層架構

1.在大學的老師講課中,可能會用到myeclipse或者eclipse來進行編譯運行。其中的缺點就是要自行去下載開發所須要的一些jar包,要考慮都版本的不一樣形成的影響,且ORACLE和MYSQL的連接容易出錯。而目前爲止企業開發基於IDEA編譯器開發,maven進行自動導包減去了大量麻煩的操做;(Maven的核心功能即是合理敘述項目間的依賴關係,通俗點講,就是經過pom.xml文件的配置獲取jar包,而不用手動去添加jar包,而這裏pom.xml文件對於學了一點maven的人來講,就有些熟悉了,怎麼經過pom.xml的配置就能夠獲取到jar包呢?pom.xml配置文件從何而來?等等相似問題咱們須要搞清楚,若是須要使用pom.xml來獲取jar包,那麼首先該項目就必須爲maven項目,maven項目能夠這樣去想,就是在java項目和web項目的上面包裹了一層maven,本質上java項目仍是java項目,web項目仍是web項目,可是包裹了maven以後,就可使用maven提供的一些功能了(經過pom.xml添加jar包)。)html

  因此,根據上一段的描述,咱們最終的目的就是學會如何在pom.xml中配置獲取到咱們想要的jar包,在此以前咱們就必須瞭解如何建立maven項目,maven項目的結構是怎樣,與普通java,web項目的區別在哪裏,還有如何配置pom.xml獲取到對應的jar包等等,這裏提早了解一下咱們如何經過pom.xml文件獲取到想要的jar的,具體能夠看一下這個視頻連接https://www.bilibili.com/video/av29071483?p=1 只看第一集基本上就能夠解決本身的困惑。前端

tomcat 服務器(用於解析jsp)java

3.下面是代碼的截圖與解析(在這步以前先作到根據2的視頻連接下載apache-maven-3.6.1或者最新版本並保存好路徑配置好apache-maven-3.6.1/conf/settings.xml信息(它是用來設置maven參數的配置文件。而且,settings.xml是maven的全局配置文件。而pom.xml文件是所在項目的局部配置。
Settings.xml中包含相似本地倉儲位置、修改遠程倉儲服務器、認證信息等配置。)mysql

maven網上https://mvnrepository.com/上覆制粘貼使用量高的兩個配置到pom.xml裏面
web

具體代碼以下sql

package com.stu.pojo;
/*實體類alt+enter實現get/set方法,toString方法,有參無參構造函數
https://blog.csdn.net/peng86788/article/details/80567548*/
public class User { private int id; private String username; private String password; @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + '}'; } public User(int id, String username, String password) { this.id = id; this.username = username; this.password = password; } public User() { } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }

jdbc訪問數據庫的接口(目的就是鏈接mysql成功)數據庫

package com.stu.jdbc;

import com.stu.pojo.User;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class Demo {

    public static void main(String[] args)throws Exception {

        //1.動態加載驅動
        Class.forName("com.mysql.jdbc.Driver");

        //2.獲取鏈接對象
        String url = "jdbc:mysql://localhost:3306/stu?useUnicode=true&characterEncoding=UTF-8";
        String user = "root";
        String pwd = "123456";
        //DriverManager管理一組 JDBC 驅動程序的基本服務,getConnection試圖創建到給定數據庫 URL 的鏈接
        Connection conn = DriverManager.getConnection(url,user,pwd);


        //3.使用JDBC接口規範實現CRUD
        String sql = "insert into user(username,password) values(?,?)";
//        String sql = "select * from user";

        /*表示預編譯的 SQL 語句的對象。 SQL 語句被預編譯並存儲在 PreparedStatement 對象中。
        而後可使用此對象屢次高效地執行該語句。*/
        PreparedStatement ps = conn.prepareStatement(sql);
//        ps.setString(1,"tom");
//        ps.setString(2,"123456");
        ps.setObject(1,"韓梅梅");
        ps.setObject(2,"lilei123");
        //將此鏈接的自動提交模式設置爲給定狀態。jdbc中默認自動提交,
        // commit或rollback不起做用,通常setAutoCommit改爲false,commit或rollback才起做用進行事務處理。
        conn.setAutoCommit(false);
        int rel = ps.executeUpdate();
        System.out.println(rel);
        conn.commit();

//          ResultSet rs = ps.executeQuery();
//         List<User> list = new ArrayList<User>();
//          while(rs.next()){
//
//              int id = rs.getInt(1);
//              String username = rs.getString(2);
//              String password = rs.getString(3);
//
//              User u = new User(id,username,password);
//              list.add(u);
//          }
//
//
//        System.out.println(list);
    }

}

Servlet是在服務器端執行的Java程序,一個被稱爲Servlet容器的程序(其實就是服務器) 負責執行Java程序,apache

(servlet的方法中使用JDBC鏈接數據庫)

package com.stu.servlet;

import com.stu.pojo.User;
import com.stu.service.UserService;

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 javax.servlet.http.HttpSession;
import java.io.IOException;
import java.sql.SQLException;

/*@WebServlet用註解來實現servlet和url的映射jsp頁面 經過action提交到此處:
 <form action="/login" method="post" >*/

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    /*幫助本身檢查是否正確的複寫了父類中已有的方法有時候寫錯了會提示錯誤緣由
    告訴讀代碼的人,這是一個複寫的方法*/
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");

        //接收請求參數
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        User user = new User();
        user.setUsername(username);
        user.setPassword(password);

        //查詢數據
        UserService us = new UserService();
        User u = null;
        try {
            u = us.login(user);
        } catch (SQLException e) {
            e.printStackTrace();
        }

        //跳轉
        if(u==null){
            req.setAttribute("mess","帳號或密碼錯誤");
            req.getRequestDispatcher("login.jsp").forward(req,resp);
        }else{
            HttpSession session =  req.getSession();
            session.setAttribute("user",u);
            resp.sendRedirect("main.jsp");
        }
    }
}

index.jsp動態頁面顯示網絡端口鏈接成功後端

<html>
<body>
<h2>Hello World!</h2>
</body>
</html>

login.jsp顯示登入成功設計模式

<%--
  Created by IntelliJ IDEA.
  User: 123
  Date: 2019/4/22
  Time: 0:42
  To change this template use File | Settings | File Templates.
--%>
<!--設置編寫語言爲java,編寫內容爲txt或者html設置編碼格式爲UTF-8-->
<%--在page directive中的isELIgnored屬性用來指定是否忽略。格式爲: <%@ page isELIgnored="true|false"%>--%>
<%--若是設定爲真,那麼JSP中的表達式被當成字符串處理。好比下面這個表達式${2000 % 20}, 在isELIgnored="true"--%>
<%--時輸出爲${2000 % 20},而isELIgnored="false"時輸出爲100。Web容器默認isELIgnored="false"。--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>

<html>
<head>
    <title>登入</title>
</head>
<body>
     <h1>用戶登入</h1>
     <hr>
    <form action="/login" method="post"/>
    <p>
        用戶名:<input type="text" name="username">
    </p>
     <p>
         密碼:<input type="password" name="password">
     </p>
    <p>
        <input type="submit" value="登入">
    </p>
</form>
    ${mess}<!--獲取後端傳輸過來的數據-->
</body>
</html>

截止到以上內容jdbc+jsp+servlet的一個例子已經完成(JSP就是視圖,其本質就是一個servlet,先有servlet後出現的jsp),這些內容表示的是控制器的運行原理

重點

B/S結構下,用戶工做界面是經過瀏覽器來實現,極少部分事務邏輯在前端(Browser)實現,可是主要事務邏輯在服務器(Server)實現,造成所謂三層結構。這樣就大大簡化了客戶端電腦載荷,減輕了系統維護與升級的成本和工做量,下降了用戶的整體成本(TCO)。

mvc三層架構(model模型對應service和dao控制訪問和修改這些數據的業務規則,view視圖對應於jsp,它從模型那裏得到數據並指定這些數據如何表現。當模型變化時,視負責維持數據表現的一致性。視同時將用戶要求告知控制器(Controller)。控制器(Controller)定義了應用程序的行爲;它負責對來自視的用戶要求進行解釋,並把這些要求映射成相應的行爲,這些行爲由模型負責實現。)注意,MVC不是Java的東西,幾乎如今全部B/S結構的軟件都採用了MVC設計模式。可是要注意,MVC在B/S結構軟件並無徹底實現,例如在咱們從此的B/S軟件中並不會有事件驅動!

 

下面是繼續增長的代碼,數據庫處理的dao層,業務邏輯service

package com.stu.dao;

import com.stu.jdbc.JDBCUtils;
import com.stu.pojo.User;

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

public class UserDao {
   /*JDBCUtils是對jdbc鏈接數據庫作了一個封裝,而getConnection這個方法就能夠
    實現對數據庫的鏈接*/
    private Connection conn = JDBCUtils.getConnection();

    /*和 Statement同樣,PreparedStatement也是用來執行sql語句的
    與建立Statement不一樣的是,須要根據sql語句建立PreparedStatement*/
    private PreparedStatement ps;

    /**
     * 添加用戶
     * @param user 要添加的用戶對象
     * @throws SQLException
     */
    public int add(User user) throws SQLException {//自動拋出異常
        String sql = "insert into user(username,password) values(?,?)";

        //來將參數化的 SQL 語句發送到數據庫
        ps = conn.prepareStatement(sql);

        //使用給定對象設置指定參數的值。
        ps.setObject(1,user.getUsername());
        ps.setObject(2,user.getPassword());

        /*在此 PreparedStatement 對象中執行 SQL 語句,該語句必須是一個 SQL 數據操做語言
        (Data Manipulation Language,DML)語句,好比 INSERT、UPDATE 或 DELETE 語句;
        或者是無返回內容的 SQL 語句,好比 DDL(數據庫模式定義語言)語句。返回對象爲int類型*/
        return ps.executeUpdate();
    }

    /**
     * 刪除
     * @param id
     * @return
     * @throws SQLException
     */
    public int delete(int id) throws SQLException {
        String sql = "delete from user where id=?";
        ps = conn.prepareStatement(sql);
        ps.setObject(1,id);
        return ps.executeUpdate();
    }

    /**
     * 修改
     * @param user
     * @return
     * @throws SQLException
     */
    public int update(User user) throws SQLException {
        String sql = "update user set username=? and password=? where id=?";
        ps = conn.prepareStatement(sql);
        ps.setObject(1,user.getUsername());
        ps.setObject(2,user.getPassword());
        ps.setObject(3,user.getId());
        return ps.executeUpdate();
    }

    /**
     * 查詢全部
     * @return
     * @throws SQLException
     */
    public List<User> findAll() throws SQLException {
        String sql = "select * from user";
        ps = conn.prepareStatement(sql);

        /*表示數據庫結果集的數據表,一般經過執行查詢數據庫的語句生成。
        ResultSet 對象具備指向其當前數據行的光標。最初,光標被置於第一行以前。
        next 方法將光標移動到下一行;由於該方法在 ResultSet 對象沒有下一行時返回 false,
        因此能夠在 while 循環中使用它來迭代結果集。默認的 ResultSet 對象不可更新,
        僅有一個向前移動的光標。所以,只能迭代它一次,而且只能按從第一行到最後一行的順序進行。*/
        /*要用statement類的executeQuery()方法來下達select指令以查詢數據庫,
        executeQuery()方法會把數據庫響應的查詢結果存放在ResultSet類對象中供咱們使用*/
        ResultSet rs = ps.executeQuery();
        /*代碼儘可能依賴於抽象,不依賴於具體」。形式就是依賴具體,這種形式就是依賴於抽象。
        由於List是接口。代碼依賴於抽象的好處是,代碼能夠方便替換。*/
        List<User> list = new ArrayList<User>();
        while(rs.next()){
            int id = rs.getInt("id");
            String username = rs.getString("username");
            String password = rs.getString("password");
            User u = new User(id,username,password);
            list.add(u);//集合列表中添加對象
        }
        return list;
    }

    /**
     * 根據ID查詢
     * @param id
     * @return
     * @throws SQLException
     */
    public User findByID(int id) throws SQLException {
        String sql = "select * from user where id=?";
        ps = conn.prepareStatement(sql);
        ps.setInt(1,id);

        ResultSet rs = ps.executeQuery();
        User u = null;
        while(rs.next()){
            int uid = rs.getInt("id");
            String username = rs.getString("username");
            String password = rs.getString("password");
            u = new User(uid,username,password);
        }
        return u;
    }

    /**
     * 登陸的方法
     */
    public User login(User user) throws SQLException {
        String sql = "select * from user where username=? and password=?";
        ps = conn.prepareStatement(sql);
        ps.setObject(1,user.getUsername());
        ps.setObject(2,user.getPassword());
        ResultSet rs = ps.executeQuery();
        User u = null;
        while(rs.next()){
            int uid = rs.getInt("id");
            String username = rs.getString("username");
            String password = rs.getString("password");
            u = new User(uid,username,password);
        }
        return u;
    }

}
package com.stu.service;

import com.stu.dao.UserDao;
import com.stu.pojo.User;

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

public class UserService {

    private UserDao userDao = new UserDao();

    /**
     * 添加用戶
     * @param user 要添加的用戶對象
     * @throws SQLException
     */
    public int add(User user) throws SQLException {
        return userDao.add(user);
    }

    /**
     * 刪除
     * @param id
     * @return
     * @throws SQLException
     */
    public int delete(int id) throws SQLException {
        return userDao.delete(id);
    }

    /**
     * 修改
     * @param user
     * @return
     * @throws SQLException
     */
    public int update(User user) throws SQLException {
        return userDao.update(user);
    }

    /**
     * 查詢全部
     * @return
     * @throws SQLException
     */
    public List<User> findAll() throws SQLException {
        return userDao.findAll();
    }

    /**
     * 根據ID查詢
     * @param id
     * @return
     * @throws SQLException
     */
    public User findByID(int id) throws SQLException {
        return userDao.findByID(id);
    }

    /**
     * 登陸
     */
    public User login(User user) throws SQLException {
        return userDao.login(user);
    }

}

 補充的代碼爲

package com.stu.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class JDBCUtils {

    public static Connection connection;
    private static String url = "jdbc:mysql://localhost:3306/stu?useUnicode=true&characterEncoding=UTF-8";
    private static String user = "root";
    private static String pwd = "123456";

    static{
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(url,user,pwd);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection(){
        return connection;
    }


}

控制層servlet應用程序對其註冊的代碼

package com.stu.servlet;

import com.stu.pojo.User;
import com.stu.service.UserService;

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 java.io.IOException;
import java.sql.SQLException;

@WebServlet("/reg")
public class RegUserServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");

        //接收請求參數
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        User user = new User();
        user.setUsername(username);
        user.setPassword(password);

        //存儲數據
        UserService us = new UserService();
        int i = 0;
        try {
            i = us.add(user);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        //跳轉
        if(i>0){
            req.setAttribute("mess","註冊成功");
            req.getRequestDispatcher("reg.jsp").forward(req,resp);
        }else{
            req.setAttribute("mess","註冊失敗");
            req.getRequestDispatcher("reg.jsp").forward(req,resp);
        }

    }
}

對應與reg.jsp

<%--
  Created by IntelliJ IDEA.
  User: 123
  Date: 2019/4/22
  Time: 0:42
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>用戶註冊</title>
</head>
<body>
<h1>用戶註冊</h1>
<hr>
<form action="/reg" method="post"/>
<p>
    用戶名:<input type="text" name="username">
</p>
<p>
    密碼:<input type="password" name="password">
</p>
<p>
    <input type="submit" value="註冊">
</p>
</form>
${mess}
</body>
</html>

main.jsp用於登入成功後實現跳轉後出現的消息

<%--
  Created by IntelliJ IDEA.
  User: 123
  Date: 2019/4/22
  Time: 0:42
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>主頁</title>
</head>
<body>
    <h1>歡迎使用本系統</h1>
    當前用戶:${sessionScope.user.username}
</body>
</html>
相關文章
相關標籤/搜索