java:JSP(JSPWeb.xml的配置,動態和靜態導入JSP文件,重定項和請求轉發,使用JSP實現數據庫的增刪改查實例)

1.JSP的配置:javascript

複製代碼
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
            + path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'register.jsp' starting page</title>
</head>

<body>
    <pre>
        JSP:java servlet page
            jsp也是一個servlet:要繼承HttpServlet--->service方法
            jsp當被訪問的時候,tomcat會自動把它編譯成Java class,會生成一個遵循某個命名規則的clas和Java文件(以login.jsp爲例,首先會把.轉換爲_,而後進行鏈接--->login_jsp.java/class,這裏的命名規則並不遵循Java的駝峯命名規則)
            這個class繼承了--->org.apache.jasper.runtime.HttpJspBase--->擁有_jspService
            org.apache.jasper.runtime.HttpJspBase繼承了---->HttpServlet--->重寫了service方法---->調用了這個class的_jspService方法
            也就是至關於tomcat把jsp文件生成Java類繼承了httpservlet
            因此說jsp也就是一個servlet
            ---->必需要配置
            <servlet>
                <servlet-name></servlet-name>
                <servlet-class></servlet-class>
            </servlet>
            
            <servlet-mapping>
                <servlet-name></servlet-name>
                <url-pattern></url-pattern>
            </servlet-mapping>
            
            jsp在tomcat的conf文件下web.xml進行配置
             <servlet>
                <servlet-name>jsp</servlet-name>
                <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
                <init-param>
                    <param-name>fork</param-name>
                    <param-value>false</param-value>
                </init-param>
                <init-param>
                    <param-name>xpoweredBy</param-name>
                    <param-value>false</param-value>
                </init-param>
                <load-on-startup>3</load-on-startup>
            </servlet>
             <servlet-mapping>
                <servlet-name>jsp</servlet-name>
                <url-pattern>*.jsp</url-pattern>
                <url-pattern>*.jspx</url-pattern>
                </servlet-mapping>
               因此org.apache.jasper.servlet.JspServlet來處理以jsp爲結尾的路徑
               JspServlet-->就是一個servlet--->重寫了service方法--->把jsp(warrper)文件轉換爲class文件
    </pre>
</body>
</html>
複製代碼

2.動態導入和靜態導入JSP文件:html

複製代碼
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%-- errorPage只能保護運行時異常(404,405,401),不能保護檢查時異常(500,600) --%>
<%@ page isErrorPage="true" %><%-- 標記本頁面是否爲錯誤頁面,提供後來人觀看代碼 --%>
<%@ page errorPage="error.jsp" %>
<%-- <%@ page import="cn.zzsxt.lee.servlet.*" %> --%><%-- 導入servlet包下的全部Java文件 --%>
<%@ page import="cn.zzsxt.lee.servlet.Test" %><%-- 導入Test.java --%>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

<title>My JSP 'login.jsp' starting page</title>

</head>

<body>
    
    <pre>
          jsp便可以寫html代碼,也能夠寫Java代碼
          jsp第一個語法:
          <!-- 是把兩個jsp文件合併成了一個jsp文件 -->
          <!-- 靜態導入:首先會把兩個jsp文件合成一個,而後再經過tomcat進行編譯,因此只編譯了一次,高耦合,因此效率也會提升 -->
          <%@ include file="top.jsp" %><!-- 不管定位到頁面的某一個位置,都能進行導入jsp文件,說白了也就是不管放在任何位置,就把導入的jsp放在哪裏 -->
              <%
                String name = "zhangsan";
                System.out.println(name);
                // String name2 = "lisi1";// 若是使用<%@ include file="top.jsp" %>導入,報兩個變量名不能相同
                String name3;
                /* int x = 1/0; */
                //System.out.println(name3);
                // 運行時異常
                    // 提示錯誤信息
                    // 只有運行時異常,纔會被errorpage保護
                // 檢查時異常
                    // 直接強行中斷正在運行的程序
                    Test test = new Test();
                    test.getName();
            %>
              <%=name%>
              <%=name2%>
              <%-- <%=x%> --%>
      </pre>
      
    <a href="register.jsp">我是跳轉頁面用的</a>
    <!-- 動態導入,會生成兩個class文件,從而tomcat編譯了兩次 -->
    <jsp:include page="footer.jsp"></jsp:include>
</body>
</html>
複製代碼

 

3.重定向和請求轉發:java

 

請求轉發:
  1.request.getRequestDispatcher("須要跳轉的路徑").forward(request, response);
  發送一次請求
  地址欄不發生改變
  request能夠傳遞參數(能參數共享)
  請求轉發並不能訪問到外部資源(外部的地址)web

 

重定向:
  2.response.sendRedirect("須要跳轉的路徑");
  發送兩次請求
  地址欄發生改變
  response不能傳遞參數(不能參數共享),若是想使用response進行參數傳遞,就得手動加載,自力更生
  重定向能夠訪問外部資源sql

   

  DIY 使用重定向response能夠將post請求方式改變爲get,反之不能(即默認爲get請求方式)。數據庫

 

  使用請求轉發request,客戶端請求是什麼方式就是什麼方式apache

 


  請求轉發
  當須要傳遞參數的時候
  訪問內部資源的時候建議使用請求轉發(服務器內部之間的調用)tomcat

  重定向
  訪問外部資源
  比較隱私和保密的地址通常推薦使用重定向服務器

  

  請求重定向:客戶端行爲,response.sendRedirect(),從本質上講等同於兩次請求,前一次的請求對象不會保持,地址欄的URL地址會改變。oracle

 

 

 

  請求轉發:服務器行爲,request.getRequsetDispatcher().forward(requset,response);是一次請求,轉發後請求對象會保存,地址欄的URL地址不會改變。(服務器內部轉發,全部客戶端看不到地址欄的改變)

 

 

 

下面舉個生活中的實例來講明:

 

  請求重定向:就比如咱們找一個A廣告公司給設計名片,A明確告訴咱們他們不會設計,就讓咱們找B公司,結果B公司給我設計好了,因此咱們會對外宣稱是B公司給咱們設計的名片,(因此咱們就至關於發送了兩次次請求,URL地址欄裏就從A變成了B公司)

 

 

 

 

 

  請求轉發:一樣去找A公司給設計名片,A公司雖然不能設計可是他們接下了咱們的活,把這項任務外包(轉發)給B公司,最終咱們會把錢給A公司,也就會對外宣稱是A公司給咱們設計的名片這就是請求重定向(因此咱們就至關於只對A發送了一次請求,URL地址欄裏依然是A公司)。

 

 

 4.使用JSP實現數據庫的增刪改查實例:

 

   註冊:

 

複製代碼
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

<title>My JSP 'register.jsp' starting page</title>


</head>

<body>


    <h1>註冊頁面</h1>
    <form action="deal_register.jsp" method="post">
        用戶名:
        <input type="text" name="username" />
        <br /> 密碼:
        <input type="password" name="pwd" /><br />
         重複密碼:
         <input type="password" name="repwd" /><br />
          手機號:
          <input type="text" name="phone" /><br />
           愛好:
          <input type="checkbox" name="hobby" value="football" />足球
          <input type="checkbox" name="hobby" value="basketball" />籃球
           <input type="checkbox" name="hobby" value="Pingpong" />乒乓球
          <br />
            性別:
            <input type="radio" name="sex" value="male" />男
            <input type="radio" name="sex" value="female" />女<br />
            <input type="submit" value="提交" />
    </form>


</body>
</html>
複製代碼

 

  處理註冊信息存入數據庫:

複製代碼
<%@ page language="java" import="java.util.*, java.sql.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

<title>My JSP 'deal_register.jsp' starting page</title>


</head>

<body>

    <%
        // 第一步:獲取input的值(也就是用戶註冊的信息)
        String username = request.getParameter("username");
        String password = request.getParameter("pwd");
        String phoneNumber = request.getParameter("phone");
        long phone = Long.parseLong(phoneNumber);
        // String hobby1 = request.getParameter("hobby");
        String[] hobby = request.getParameterValues("hobby");
        String[] sex = request.getParameterValues("sex");
        String hobbys= "";// "football,basketball,pingpong"
        //hobby.length爲3
        for(int i = 0;i < hobby.length; i++) {
            /* if(hobby.length-1 > i) {
                hobbys +=hobby[i]+",";// 最後一位是,
            } else {
                hobbys +=hobby[i];
            } */
            
            hobbys +=hobby[i]+",";
        }
        hobbys = hobbys.substring(0,hobbys.length()-1);
        
        //String sex1 = request.getParameter("sex");// 若是是單選或者多選的話,使用request.getParameter()--->on,規定不管是單選仍是多選或者下拉使用request.getParameterValues();
    
    
        // 第二步:插入數據,id使用UUID
            //1.導入ojdbc6.jar
            //2.加載驅動(反射)
            Class.forName("oracle.jdbc.driver.OracleDriver");
            //3.獲取鏈接
            Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","scott","scott");
            //4.獲取預編譯的statement(String sql)
            String sql = "insert into students (id, stu_name, stu_age, stu_pwd, stu_hobby, stu_sex, stu_phone) values(?,?,?,?,?,?,?)";
            PreparedStatement ps = conn.prepareStatement(sql);
            //5.設置參數ps.setxxxx
            ps.setString(1,UUID.randomUUID().toString());
            ps.setString(2, username);
            ps.setInt(3, 32);
            ps.setString(4, password);
            ps.setString(5, hobbys);
            ps.setString(6,sex[0]);
            ps.setLong(7, phone);
            //6.調用executeUpdate();--->返回值爲受影響的行數
            int result = ps.executeUpdate();
            //7.判斷接收的int類型數據,判斷是否大於0(大於0成功,小於0失敗)
            if(result > 0) {
                // 成功
            } else {
                // 失敗
            }
    %>


</body>
</html>
複製代碼

  登陸:

複製代碼
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

<title>My JSP 'login.jsp' starting page</title>


</head>

<body>

    <form action="deal_login.jsp" method="post">
        用戶名:
        <input type="text" name="username" />
        <br /> 密碼:
        <input type="password" name="pwd" />
        <input type="submit" value="提交" />
    </form>


</body>
</html>
複製代碼

  處理登陸,預跳轉至主頁處理的界面(查詢數據庫所有數據):

複製代碼
<%@ page language="java"
    import="java.util.*, java.sql.*, cn.zzsxt.lee.web.entity.*"
    pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

<title>My JSP 'deal_login.jsp' starting page</title>


</head>

<body>


    <%
        String username = request.getParameter("username");
        String password = request.getParameter("pwd");

        //1.加載驅動
        Class.forName("oracle.jdbc.driver.OracleDriver");
        //2.獲取鏈接
        Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "scott");
        //3.獲取預編譯的statement
        String sql = "select * from teacher where name=? and password=?";
        PreparedStatement ps = conn.prepareStatement(sql);
        //4.設置參數
        ps.setString(1, username);
        ps.setString(2, password);
        //5.調用executeQuery();-->返回ResultSet
        ResultSet rs = ps.executeQuery();
        //6.遍歷結果集
        Teacher teacher = new Teacher();
        while (rs.next()) {
            teacher.setId(rs.getInt("id"));
            teacher.setUsername(rs.getString("name"));
            teacher.setPassword(rs.getString("password"));
            teacher.setDescription(rs.getString("description"));
        }
        //7.判斷是否查詢出數據
        if (teacher.getUsername() != null && !"".equals(teacher.getUsername())) {// 把「」放在前面,防止空指針
            // 成功,跳轉主頁面的處理頁面
        //    request.getRequestDispatcher("deal_index.jsp").forward(request, response);// 跳轉頁面
            request.getRequestDispatcher("frameset_index.jsp").forward(request, response);// 跳轉頁面
        } else {
            // 失敗,跳轉404
            //response.sendRedirect("404.jsp");
            request.getRequestDispatcher("404.jsp").forward(request, response);
        }
    %>



</body>
</html>
複製代碼

  主頁處理界面,預跳轉至主頁:

複製代碼
<%@ page language="java"
    import="java.util.*, java.sql.*, cn.zzsxt.lee.web.entity.*"
    pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

<title>My JSP 'deal_index.jsp' starting page</title>


</head>

<body>


    <%
        //1.加載驅動
        Class.forName("oracle.jdbc.driver.OracleDriver");
        //2.獲取鏈接
        Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "scott");
        //3.獲取預編譯的statement
        String sql = "select * from students";
        PreparedStatement ps = conn.prepareStatement(sql);
        //4.調用executeQuery();-->返回ResultSet
        ResultSet rs = ps.executeQuery();
        //5.遍歷結果集
        // 定義一個泛型爲Student的List集合
        List<Student> list = new ArrayList<Student>();
        while (rs.next()) {
            Student student = new Student();
            student.setId(rs.getString("id"));
            student.setStuName(rs.getString("stu_name"));
            student.setStuPassword(rs.getString("stu_pwd"));
            list.add(student);
        }
        //6.判斷list的長度大於0
        if(list.size() > 0) {
            // 成功,跳轉到主頁面
            request.setAttribute("list", list);//--->Map.get("key");--->map.put("name",24);Map<String, Object>
            request.getRequestDispatcher("index.jsp").forward(request, response);
        } else {
            // 失敗
        }
    %>



</body>
</html>
複製代碼

  跳轉至主頁,顯示全部數據,及修改和刪除的功能:

複製代碼
<%@ page language="java" import="java.util.*, cn.zzsxt.lee.web.entity.*"
    pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

<title>My JSP 'index.jsp' starting page</title>

<script type="text/javascript">

    function trueDelete(id) {
        if (confirm("您肯定要刪除數據麼?")) {
            window.location.href = "deal_delete.jsp?id=" + id;
        }
    }
</script>

</head>

<body>


    <table border="1">
        <thead>
            <tr>
                <th>學生編號</th>
                <th>學生姓名</th>
                <th>學生密碼</th>
                <th>操做</th>
            </tr>
        </thead>

        <tbody>

            <%
                List<Student> listStudent = (List<Student>) request.getAttribute("list");
                for (int i = 0; i < listStudent.size(); i++) {
                    listStudent.get(i).getId();// 獲取student對象的id
            %>
            <%-- jsp的註釋 --%>
            <tr>
                <!-- 一個tr表明了一行,說白了就是表明一個student對象 -->
                <td><%=listStudent.get(i).getId()%></td>
                <!-- <%--<%= %>--%>輸出頁面 -->
                <td><%=listStudent.get(i).getStuName()%></td>
                <td><%=listStudent.get(i).getStuPassword()%></td>
                <td><a href="javascript:void(0);"
                    onclick="trueDelete('<%=listStudent.get(i).getId()%>');">刪除</a>
                    <a href="select_by_id.jsp?id=<%=listStudent.get(i).getId()%>">修改</a>    
                </td>
                <!-- 刪除功能(主鍵id刪除)須要傳遞一個參數,一樣須要操做數據庫,須要deal_delete.jsp進行處理 -->
            </tr>
            <%
                }
            %>
        </tbody>

    </table>




</body>
</html>
複製代碼

  刪除功能,刪除處理界面,預跳轉至主頁處理界面(查詢刪除後還剩的數據,即全部數據)

複製代碼
<%@ page language="java" import="java.util.*, java.sql.*"
    pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

<title>My JSP 'deal_delete.jsp' starting page</title>


</head>

<body>


    <%
        //全部經過路徑傳遞的參數都要使用request.getParameter()
        String id = request.getParameter("id");
        //1.加載驅動
        Class.forName("oracle.jdbc.driver.OracleDriver");
        //2.獲取鏈接
        Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "scott");
        //3.獲取預編譯的statement
        String sql = "delete from students where id=?";
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setString(1, id);
        int result = ps.executeUpdate();
        if (result > 0) {
            //成功
            request.getRequestDispatcher("deal_index.jsp").forward(request, response);
        } else {
            // 失敗
        }
    %>

</body>
</html>
複製代碼

  修改功能,首先跳轉至查詢某一行的界面,預跳轉至修改界面

複製代碼
<%@ page language="java"
    import="java.util.*, java.sql.*, cn.zzsxt.lee.web.entity.*"
    pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

<title>My JSP 'select_by_id.jsp' starting page</title>


</head>

<body>

    <%
        String id = request.getParameter("id");
        // 進行查詢(經過id)
        //1.加載驅動
        Class.forName("oracle.jdbc.driver.OracleDriver");
        //2.獲取鏈接
        Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "scott");
        //3.獲取預編譯的statement
        String sql = "select * from students where id=?";
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setString(1, id);
        //4.調用executeQuery();-->返回ResultSet
        ResultSet rs = ps.executeQuery();
        //5.遍歷結果集
        Student stu = new Student();
        while (rs.next()) {
            stu.setId(rs.getString("id"));
            stu.setStuName(rs.getString("stu_name"));
            stu.setStuPassword(rs.getString("stu_pwd"));
        }
        if (stu.getId() != null) {
            request.setAttribute("stu", stu);
            request.getRequestDispatcher("update.jsp").forward(request, response);
        } else {
            // 跳轉報錯頁面
        }
    %>




</body>
</html>
複製代碼

  修改界面,以form表單的形式顯示讓用戶動態修改,預提交至修改處理界面

複製代碼
<%@ page language="java" import="java.util.*, cn.zzsxt.lee.web.entity.*"
    pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

<title>My JSP 'update.jsp' starting page</title>


</head>

<body>
    <%
        Student stu = (Student) request.getAttribute("stu");
    %>

    <form action="deal_update.jsp" method="post">
        學生編號:
        <input type="text" value="<%=stu.getId()%>" name="id" readonly="readonly" />
        <br /> 學生姓名:
        <input type="text" value="<%=stu.getStuName()%>" name="username" />
        <br /> 學生密碼:
        <input type="text" value="<%=stu.getStuPassword()%>" name="pwd" />
        <br />
        <input type="submit" value="修改" />
    </form>



</body>
</html>
複製代碼

  修改界面,修改數據庫中的數據,預跳轉至主頁處理界面(查詢修改後的數據,即全部數據)

複製代碼
<%@ page language="java" import="java.util.*, java.sql.*"
    pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

<title>My JSP 'deal_update.jsp' starting page</title>


</head>


<body>


    <%
        String id = request.getParameter("id");
        String username = request.getParameter("username");
        String pwd = request.getParameter("pwd");

        //1.加載驅動
        Class.forName("oracle.jdbc.driver.OracleDriver");
        //2.獲取鏈接
        Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "scott");
        //3.獲取預編譯的statement
        String sql = "update students set stu_name=?, stu_pwd=? where id=?";
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setString(1, username);
        ps.setString(2, pwd);
        ps.setString(3, id);
        int result = ps.executeUpdate();
        if (result > 0) {
            response.sendRedirect("deal_index.jsp");
            return;
            //request.getRequestDispatcher("deal_index.jsp").forward(request, response);//forward標識了跳轉頁面的規則,攜帶着request和response一塊兒跳轉頁面,因此請求轉發才能夠傳遞參數
            //System.out.println("我是轉發以後的代碼,我被執行了");
            // 若是使用兩個response或者request的狀況下,就會報錯Cannot call sendRedirect() after the response has been committed
            // 可是重定向直接報500,中斷程序,請求轉發不會中斷程序,能夠繼續運行
            //response.sendRedirect("404.jsp");
        } else {
            //跳轉錯誤頁面
            response.sendRedirect("404.jsp");
            return;
        }
    %>


</body>
</html>
複製代碼

 

 
分類:  Java, Java EE, JSP
相關文章
相關標籤/搜索