JavaWeb總結(國稅)

1、JavaWeb示例

1.一、Servlet Hello World&IDEA建立第一個Servlet

新建項目javascript

 選擇mavencss

組織名與項目名html

位置,完成java

容許自動導入包node

添加框架支持,變換成web項目mysql

選擇web applicationjquery

若是沒有Web-INF程序員

添加Web容器支持,tomcatweb

添加tomcat面試

設置tomcat屬性

設置虛擬目錄

運行

添加一個Servlet

新建個一個用於存放servlet的包com.tax.action

結果

 建立一個servlet

添加Servlet依賴的包

選擇要依賴的環境

修改Servlet類,結果以下:

package com.tax.action;

import java.io.IOException;
import java.io.PrintWriter;

//註解,訪問路徑
@javax.servlet.annotation.WebServlet("/HiServlet")
public class HiServlet extends javax.servlet.http.HttpServlet {
    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        doGet(request,response);
    }

    protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        //設置HTTP內容類型
        response.setContentType("text/html;charset=utf-8");
        //得到輸出對象
        PrintWriter out=response.getWriter();
        //向客戶端響應一串字符
        out.println("<h2>Hello Servlet!</h2>");
    }
}

運行結果:

1.二、得到參數

reg.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
    <title>用戶註冊</title>
    <meta charset="UTF-8" />
</head>
<body>
<form method="post" action="Reg">
    <h2>用戶註冊</h2>
    <p>
        姓名:<input type="text" name="name"/>
    </p>
    <p>
        愛好:
        <input type="checkbox" name="hobby" value="運動"/>運動
        <input type="checkbox" name="hobby" value="電影"/>電影
        <input type="checkbox" name="hobby" value="閱讀"/>閱讀
    </p>
    <p>
        <input type="submit" value="提交" />
    </p>
</form>
</body>
</html>

Reg Servlet

package com.tax.action;

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.io.PrintWriter;

@WebServlet("/Reg")
public class Reg extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //設置編碼
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=utf-8");
        response.setCharacterEncoding("utf-8");
        //得到輸出對象
        PrintWriter out=response.getWriter();
        //得到單個參數
        String name=request.getParameter("name");  //得到元素name=name的值
        out.println("姓名:"+name+"<br/>");
        //得到多個參數
        String[] hobbies=request.getParameterValues("hobby");  //得到全部name=hobby的值,數組
        out.println("愛好:");
        for (String hobby:hobbies){ //遍歷輸出全部的愛好
            out.println(hobby);
        }
    }
}

運行結果:

提交後

1.三、編碼處理

前臺

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

後臺代碼

        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=utf-8");
        response.setCharacterEncoding("utf-8");

 

字符

String msg = request.getParameter("message");
String str=new String(msg.getBytes("ISO-8859-1"),"UTF-8");

byte []b = ss.getBytes("GBK"); 
ss = new String(b,"UTF-8");

tomcat

server.xml文件

  <Connector     
  port="80"   maxThreads="150"   minSpareThreads="25"   maxSpareThreads="75"   
  enableLookups="false"   redirectPort="8443"   acceptCount="100"   
  debug="0"   connectionTimeout="20000"     
  disableUploadTimeout="true"     
  URIEncoding="UTF-8"   
  />     

 1.四、重定向、轉發與Session

login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    //若是爲空則得到空字符,不然取值
    String uid = request.getParameter("uid") == null ? "" : request.getParameter("uid");
    String pwd = request.getParameter("pwd") == null ? "" : request.getParameter("pwd");
    Object msg=request.getAttribute("message")==null?"":request.getAttribute("message");
%>
<html>
<head>
    <title>登陸</title>
</head>
<body>
<form action="Login" method="post">
    <p>
        賬號:<input name="uid" value="<%=uid%>"/>
    </p>
    <p>
        密碼:<input name="pwd" type="password" value="<%=pwd%>"/>
    </p>
    <p>
        <input type="submit" value="登陸"/>
    </p>
    <p>
        <%=msg.toString()%>
    </p>
</form>
</body>
</html>

Login Servlet

package com.tax.action;

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.io.PrintWriter;

@WebServlet("/Login")
public class Login extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //設置編碼
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=utf-8");
        response.setCharacterEncoding("utf-8");
        //得到輸出對象
        PrintWriter out=response.getWriter();
        //得到單個參數
        String uid=request.getParameter("uid");
        String pwd=request.getParameter("pwd");
        //若是用戶名與密碼爲admin,123456
        if(uid.equals("admin")&&pwd.equals("123456")){
            //向Session寫入當前登陸的用戶信息
            request.getSession().setAttribute("user",uid);
            //成功,重定向到後臺首頁,路徑變化了,但request,response對象在index.jsp中沒法使用
            response.sendRedirect("backend/index.jsp");
        }else{
            //在請求中添加屬性
            request.setAttribute("message","用戶名或密碼不正確");
            //轉發,路徑不變,但request與response能夠再使用
            request.getRequestDispatcher("login.jsp").forward(request,response);
        }
    }
}

後臺backend/index.jsp

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2018/3/14
  Time: 11:33
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    Object user=request.getSession().getAttribute("user");
    if(user==null) {
        response.sendRedirect("../login.jsp");
    }
%>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h2>歡迎您(<%=user+""%>)登陸後臺!</h2>
</body>
</html>

運行結果:

 

 2、綜合示例

2.一、Oracle數據庫與表

create table book
(
       id int not null primary key,
       title varchar2(128) not null unique,
       typename varchar2(128) not null,
       price numeric(10,2) default(0),
       state varchar2(10) default('未借出')
)

insert into book(id,title,Typename,Price,State) 
select 1,'零基礎學Java(全綵版)','計算機',50.60,'未借出' from dual union
select 2,'輕量級Java EE企業應用實戰','軟件工程',85.30,'未借出' from dual union
select 3,'Java併發編程的藝術','軟件工程',45.40,'未借出' from dual union
select 4,'實戰Java高併發程序設計','軟件開發',48.70,'未借出' from dual union
select 5,'Java程序員面試筆試寶典','神話',38.50,'已借出' from dual union
select 6,'Java Web從入門到精通','計算機',71.00,'未借出' from dual union
select 7,'Java編程思想(第4版)','計算機',70.10,'已借出' from dual union
select 8,'深刻理解JAVA虛擬機','神話',65.00,'未借出' from dual union
select 9,'從零開始寫Java Web框架','計算機',63.20,'已借出' from dual

select id, title, typename, price, state from book
commit;

 

2.二、Java Bean

Book.java

package com.tax.model;

/**圖書*/
public class Book {
    /**編號*/
    private int id;
    /**書名*/
    private String title;
    /**類型*/
    private String typename;
    /**價格*/
    private double price;
    /**狀態*/
    private String state;
    
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getTypename() {
        return typename;
    }

    public void setTypename(String typename) {
        this.typename = typename;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }
}

 

2.三、BookDao 圖書的數據訪問層

2.3.一、添加Oracle驅動

2.3.二、封裝JDBC數據訪問工具類

package com.tax.dao;

/**
 * Created by Administrator on 2017/8/10.
 */

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class JDBCUtil {

    public static String DRIVER="oracle.jdbc.driver.OracleDriver";
    public static String URL="jdbc:oracle:thin:@127.0.0.1:1521:orcl";
    public static String USER_NAME="tax";
    public static String PASSWORD="orcl";

    //加載驅動
    static {
        try {
            Class.forName(DRIVER);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    private JDBCUtil() {

    }

    /**
     * 得到鏈接
     *
     * @return
     */
    public static Connection getconnnection() {
        Connection con = null;
        try {
            con = DriverManager.getConnection(URL, USER_NAME, PASSWORD);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return con;
    }

    /**
     * 關閉鏈接
     *
     * @param rs
     * @param st
     * @param con
     */
    public static void close(ResultSet rs, Statement st, Connection con) {
        try {
            try {
                if (rs != null) {
                    rs.close();
                }
            } finally {
                try {
                    if (st != null) {
                        st.close();
                    }
                } finally {
                    if (con != null)
                        con.close();
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 關閉鏈接
     *
     * @param rs
     */
    public static void close(ResultSet rs) {
        Statement st = null;
        Connection con = null;
        try {
            try {
                if (rs != null) {
                    st = rs.getStatement();
                    rs.close();
                }
            } finally {
                try {
                    if (st != null) {
                        con = st.getConnection();
                        st.close();
                    }
                } finally {
                    if (con != null) {
                        con.close();
                    }
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 關閉鏈接
     *
     * @param st
     * @param con
     */
    public static void close(Statement st, Connection con) {
        try {
            try {
                if (st != null) {
                    st.close();
                }
            } finally {
                if (con != null)
                    con.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * insert/update/delete
     * 增長/更新/刪除
     *
     * @param sql 數據庫語句
     * @param args 可變參數(能夠不帶參數,能夠帶0-n個參數)
     * @return
     */
    public static int update(String sql, Object... args) {
        int result = 0;
        Connection con = getconnnection();
        PreparedStatement ps = null;
        try {
            ps = con.prepareStatement(sql);
            if (args != null) {
                for (int i = 0; i < args.length; i++) {
                    ps.setObject((i + 1), args[i]);
                }
            }
            result = ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close(ps, con);
        }

        return result;
    }

    /**
     * query, because need to manually close the resource, so not recommended
     * for use it
     *
     * @param sql
     * @param args
     * @return ResultSet
     */
    @Deprecated  //註解
    public static ResultSet query(String sql, Object... args) {
        ResultSet result = null;
        Connection con = getconnnection();
        PreparedStatement ps = null;
        try {
            ps = con.prepareStatement(sql);
            if (args != null) {
                for (int i = 0; i < args.length; i++) {
                    ps.setObject((i + 1), args[i]);
                }
            }
            result = ps.executeQuery();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * Query a single record
     * 查詢單個記錄
     * @param sql
     * @param args
     * @return Map<String,Object>
     */
    public static Map<String, Object> queryForMap(String sql, Object... args) {
        Map<String, Object> result = new HashMap<String, Object>();
        List<Map<String, Object>> list = queryForList(sql, args);
        if (list.size() > 0) {
            result = list.get(0);
        }
        return result;
    }

    /**
     * Query a single record
     * 查詢單個記錄返回強類型對象
     * @param sql
     * @param args
     * @return <T>  //泛型
     */
    public static <T> T queryForObject(String sql, Class<T> clz, Object... args) {
        T result = null;
        List<T> list = queryForList(sql, clz, args);
        if (list.size() > 0) {
            result = list.get(0);
        }
        return result;
    }

    /**
     * Query a single record
     *
     * @param sql
     * @param args
     * @return List<Map<String,Object>>
     */
    public static List<Map<String, Object>> queryForList(String sql, Object... args) {
        List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
        Connection con = null;
        ResultSet rs = null;
        PreparedStatement ps = null;
        try {
            con = getconnnection();
            ps = con.prepareStatement(sql);
            if (args != null) {
                for (int i = 0; i < args.length; i++) {
                    ps.setObject((i + 1), args[i]);
                }
            }
            rs = ps.executeQuery();
            ResultSetMetaData rsmd = rs.getMetaData();
            int columnCount = rsmd.getColumnCount();
            while (rs.next()) {
                Map<String, Object> map = new HashMap<String, Object>();
                for (int i = 1; i <= columnCount; i++) {
                    map.put(rsmd.getColumnLabel(i), rs.getObject(i));
                }
                result.add(map);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close(rs, ps, con);
        }
        return result;
    }

    /**
     * Query records
     * 查詢多個對象,返回強類型集合
     * @param sql
     * @param args
     * @return List<T>
     */
    public static <T> List<T> queryForList(String sql, Class<T> clz, Object... args) {
        List<T> result = new ArrayList<T>();
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            con = getconnnection();
            ps = con.prepareStatement(sql);
            if (args != null) {
                for (int i = 0; i < args.length; i++) {
                    ps.setObject((i + 1), args[i]);
                }
            }
            rs = ps.executeQuery();
            ResultSetMetaData rsmd = rs.getMetaData();
            int columnCount = rsmd.getColumnCount();
            while (rs.next()) {
                T obj = clz.newInstance();
                for (int i = 1; i <= columnCount; i++) {
                    String columnName = rsmd.getColumnName(i);
                    String methodName = "set" + columnName.substring(0, 1).toUpperCase()
                            + columnName.substring(1, columnName.length()).toLowerCase();
                    Method method[] = clz.getMethods();
                    for (Method meth : method) {
                        if (methodName.equals(meth.getName())) {
                            meth.invoke(obj, rs.getObject(i));
                        }
                    }
                }
                result.add(obj);
            }
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } finally {
            close(rs, ps, con);
        }
        return result;
    }
}

 

2.3.三、BookDao訪問圖書表

package com.tax.dao;

import com.tax.model.Book;

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

/**
 * 用於訪問數據庫中的Book表
 */
public class BookDao {
    /***
     * 得到全部的圖書
     * @return
     */
    public List<Book> getAllBooks() {
        List<Book> result = null;
        Connection conn = null;
        PreparedStatement statement = null;
        ResultSet set = null;
        try {
            //得到鏈接對象
            conn = JDBCUtil.getconnnection();
            //建立sql命令對象
            statement = conn.prepareStatement("select id, title, typename, price, state from book");
            //執行查詢返回結果集
            set = statement.executeQuery();
            result = new ArrayList<Book>();
            //遍歷結果集
            while (set.next()) {
                Book book = new Book();  //建立圖書對象
                book.setId(set.getInt("id"));  //從結果集中得到當前行列名爲id的值轉成int類型
                book.setTypename(set.getString("typename"));
                book.setTitle(set.getString("title"));
                book.setState(set.getString("state"));
                book.setPrice(set.getDouble("price"));
                result.add(book);  //將圖書對象添加到集合中
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtil.close(set, statement, conn);
        }

        //返回結果
        return result;
    }

    public static void main(String[] args) {
        BookDao dao=new BookDao();
        for (Book book:dao.getAllBooks()) {
            System.out.println(book.getTitle());
        }
    }
}

2.四、圖書列表

Book.jsp

<%@ page import="com.tax.dao.BookDao" %>
<%@ page import="com.tax.model.Book" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%
    BookDao dao=new BookDao();
%>


<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>Book</title>
    <link rel="stylesheet" type="text/css" href="js/jPicture.min.css" />
    <style type="text/css">
        * {
            margin: 0;
            padding: 0;
        }

        #container {
            width: 1004px;
            margin: 0 auto;
        }

        #header {
            height: 200px;
            background: url(images/top.png) no-repeat;
        }

        #menu {
            background: orangered;
        }

        #menu a {
            width: 100px;
            display: inline-block;
            background: orangered;
            height: 30px;
            text-align: center;
            line-height: 30px;
            text-decoration: none;
            color: white;
        }

        #menu a:hover {
            background: mistyrose;
            color: orangered;
        }

        #banner img {
            width: 1004px;
        }

        #main {
            clear: both;
            overflow: hidden;
            margin-bottom: 10px;
        }

        #main #left {
            width: 30%;
            float: left;
            background: lightblue;
            height: 400px;
        }

        #main #right {
            width: 70%;
            float: left;
        }

        #main .bookitem {
            width: 30%;
            float: left;
            margin-right: 3%;
        }

        #footer {
            clear: both;
            text-align: center;
            background: lightsalmon;
            height: 65px;
            line-height: 30px;
            padding-top: 5px;
        }

        #left a {
            width: 100%;
            display: inline-block;
            /*行內塊標籤,行內標籤設置寬度無效*/
            background: orangered;
            height: 30px;
            text-align: center;
            line-height: 30px;
            text-decoration: none;
            /*去下劃線*/
            color: white;
        }

        #banner{ width: 1004px; height: 300px;}
    </style>
</head>

<body>
<div id="container">
    <div id="header"></div>
    <div id="menu">
        <a href="#">圖書列表</a>
        <a href="#">用戶登陸</a>
        <a href="#">後臺管理</a>
        <a href="#">圖書列表</a>
        <a href="#">用戶登陸</a>
        <a href="#">後臺管理</a>
    </div>
    <div id="banner">
        <div>
            <div>
                <a href="#">
                    <img src="images/adv3.jpg" />
                </a>
            </div>
            <div>
                <a href="#">
                    <img src="images/adv2.jpg" />
                </a>
            </div>
            <div>
                <a href="#">
                    <img src="images/adv1.jpg" />
                </a>
            </div>
        </div>
    </div>
    <div id="main">
        <div id="left">
            <a href="#">圖書列表</a>
            <a href="#">用戶登陸</a>
            <a href="#">後臺管理</a>
            <a href="#">圖書列表</a>
            <a href="#">用戶登陸</a>
            <a href="#">後臺管理</a>
        </div>
        <div id="right">
            <%for (Book book: dao.getAllBooks()) {%>
            <div class="bookitem">
                <p class="picture">
                    <img src="images/book(<%=book.getId()%>).jpg" />
                </p>
                <p class="price"><%=book.getPrice()%>
                </p>
                <p class="title">
                    <%=book.getTitle()%>
                </p>
                <p class="state">
                    <%=book.getState()%>
                </p>
            </div>
            <%}%>
        </div>
    </div>
    <div id="footer">
        <p>
            關於咱們 | 聯繫咱們 | 聯繫客服 | 合做招商 | 商家幫助 | 營銷中心 | 手機書店 | 友情連接 | 銷售聯盟
        </p>
        <p>
            Copyright @ 2004 - 2018 國稅JavaEE版權全部
        </p>
    </div>
</div>
<script src="js/jquery-1.11.3.min.js" type="text/javascript" charset="utf-8"></script>
<script src="js/jPicture.min.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
    jPicture("#banner", {
        type: "slide",
        autoplay: 2000
    });
</script>
</body>

</html>

結果:

2.五、JSTL+MVC展現圖書

BookController控制器

package com.tax.action;

import com.tax.dao.BookDao;

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;

@WebServlet("/Book")
public class BookController extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        BookDao dao=new BookDao();
        request.setAttribute("books",dao.getAllBooks());
        request.getRequestDispatcher("booklist.jsp").forward(request,response);
    }
}

booklist.jsp視圖

<%@ page import="com.tax.dao.BookDao" %>
<%@ page import="com.tax.model.Book" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>Book</title>
    <link rel="stylesheet" type="text/css" href="js/jPicture.min.css"/>
    <style type="text/css">
        * {
            margin: 0;
            padding: 0;
        }

        #container {
            width: 1004px;
            margin: 0 auto;
        }

        #header {
            height: 200px;
            background: url(images/top.png) no-repeat;
        }

        #menu {
            background: orangered;
        }

        #menu a {
            width: 100px;
            display: inline-block;
            background: orangered;
            height: 30px;
            text-align: center;
            line-height: 30px;
            text-decoration: none;
            color: white;
        }

        #menu a:hover {
            background: mistyrose;
            color: orangered;
        }

        #banner img {
            width: 1004px;
        }

        #main {
            clear: both;
            overflow: hidden;
            margin-bottom: 10px;
        }

        #main #left {
            width: 30%;
            float: left;
            background: lightblue;
            height: 400px;
        }

        #main #right {
            width: 70%;
            float: left;
        }

        #main .bookitem {
            width: 30%;
            float: left;
            margin-right: 3%;
        }

        #footer {
            clear: both;
            text-align: center;
            background: lightsalmon;
            height: 65px;
            line-height: 30px;
            padding-top: 5px;
        }

        #left a {
            width: 100%;
            display: inline-block;
            /*行內塊標籤,行內標籤設置寬度無效*/
            background: orangered;
            height: 30px;
            text-align: center;
            line-height: 30px;
            text-decoration: none;
            /*去下劃線*/
            color: white;
        }

        #banner {
            width: 1004px;
            height: 300px;
        }
    </style>
</head>

<body>
<div id="container">
    <div id="header"></div>
    <div id="menu">
        <a href="#">圖書列表</a>
        <a href="#">用戶登陸</a>
        <a href="#">後臺管理</a>
        <a href="#">圖書列表</a>
        <a href="#">用戶登陸</a>
        <a href="#">後臺管理</a>
    </div>
    <div id="banner">
        <div>
            <div>
                <a href="#">
                    <img src="images/adv3.jpg"/>
                </a>
            </div>
            <div>
                <a href="#">
                    <img src="images/adv2.jpg"/>
                </a>
            </div>
            <div>
                <a href="#">
                    <img src="images/adv1.jpg"/>
                </a>
            </div>
        </div>
    </div>
    <div id="main">
        <div id="left">
            <a href="#">圖書列表</a>
            <a href="#">用戶登陸</a>
            <a href="#">後臺管理</a>
            <a href="#">圖書列表</a>
            <a href="#">用戶登陸</a>
            <a href="#">後臺管理</a>
        </div>
        <div id="right">
            <c:forEach var="book" items="${books}">
                <div class="bookitem">
                    <p class="picture">
                        <img src="images/book(${book.id}).jpg"/>
                    </p>
                    <p class="price">
                        ¥${book.price}
                    </p>
                    <p class="title">
                            ${book.title}
                    </p>
                    <p class="state">
                            ${book.state}
                    </p>
                </div>
            </c:forEach>
        </div>
    </div>
    <div id="footer">
        <p>
            關於咱們 | 聯繫咱們 | 聯繫客服 | 合做招商 | 商家幫助 | 營銷中心 | 手機書店 | 友情連接 | 銷售聯盟
        </p>
        <p>
            Copyright @ 2004 - 2018 國稅JavaEE版權全部
        </p>
    </div>
</div>
<script src="js/jquery-1.11.3.min.js" type="text/javascript" charset="utf-8"></script>
<script src="js/jPicture.min.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
    jPicture("#banner", {
        type: "slide",
        autoplay: 2000
    });
</script>
</body>

</html>

結果:

 2.六、添加圖書

addBook.jsp

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2018/3/14
  Time: 17:07
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>添加圖書</title>
</head>
<body>
<form method="post" action="AddBook">
    <h2>添加圖書</h2>
    <fieldset>
        <legend>圖書詳細</legend>
        <p>
            書名:<input type="text" name="title"/>
        </p>
        <p>
            類型:<select name="typename">
            <option value="計算機">計算機</option>
            <option value="神話">神話</option>
            <option value="軟件工程">軟件工程</option>
        </select>
        </p>
        <p>
            價格:<input type="text" name="price"/>
        </p>
        <p>
            狀態:<input type="checkbox" name="state" value="已借出"/>已借出
            <input type="checkbox" name="state" value="未借出"/>未借出
        </p>
        <p>
            描述:<textarea name="memo" cols="50" rows="5"></textarea>
        </p>
        <p>
            <input type="submit" value="添加" />
        </p>
        <P>
        <%=request.getAttribute("msg")==null?"":request.getAttribute("msg")%>
        </P>
    </fieldset>
</form>
</body>
</html>

AddBook Servlet

package com.tax.action;

import com.tax.dao.BookDao;
import com.tax.model.Book;

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;

@WebServlet("/AddBook")
public class AddBook extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //設置編碼
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=utf-8");
        response.setCharacterEncoding("utf-8");

        String title=request.getParameter("title");
        String state=request.getParameter("state");
        String price=request.getParameter("price");
        String typename=request.getParameter("typename");

        Book book=new Book();
        book.setTitle(title);
        book.setState(state);
        book.setTypename(typename);
        book.setPrice(Double.parseDouble(price));

        BookDao dao=new BookDao();
        if(dao.add(book)>0)
        {
            response.sendRedirect("book.jsp");
        }else {
            request.setAttribute("msg","添加失敗");
            request.getRequestDispatcher("addBook.jsp").forward(request,response);
        }
    }

}

運行結果

 

3、總結

?
day1

JSP 定義:

     1)Java Server Page, Java EE 組件,本質上是 Servlet。
     2)運行在 Web Container.接收 Http Request,生成 Http Response(默認協議是 Http 請求和響應)
     3)JSP 使得咱們可以分離頁面的靜態 HTML 和動態部分——咱們須要的技術。
     4)使頁面能夠混和html代碼、Java代碼以及JSP標籤;容許訪問組件
  
Servlet的缺陷(JSP出現的緣由):
     1)寫靜態頁面必須部署後才能看到效果,很難控制頁面的外觀。
     2)從技術角度來講Servlet是Java代碼和HTML靜態代碼的混合代碼。
     3)從市場競爭角度來講,微軟推出了ASP產品。
  
JSP的改進:
     1)JSP是標籤式的文本文件(區Servlet是Java文件)
     2)JSP不須要編譯(實際上是由服務器監測JSP文件的變化,再將其翻譯成 Servlet 代碼)
       服務器對其進行編譯並在第一次請求時建立一個Servlet實例。因此,第一次訪問JSP頁面時會後延遲
     3)JSP不用寫配置文件
     4)JSP以靜態代碼爲主,Java代碼爲輔。Servlet反之。
     5)是J2EE藍圖的一部分(Servlet、JSP以及EJB是J2EE的三大組件)
     JSP從本質上來講內核仍是Servlet,但與Servlet不是替代關係而是一種互補的關係。
     JSP適合於寫顯示層的動態頁面,而Servlet則適合寫控制層的業務控制(頁面轉發)。
     JSP往純標籤方向發展,Servlet往純代碼方向發展,他們以Servlet內核(請求響應式的工做方式)往兩個方向發展。
  
 

基本語法

1、JSP的聲明(statement)

    用來定義在產生的類文件中的類的屬性和方法(成員變量)。可聲明類(便是內部類)。
    因爲servlet是工做在多線程環境下,因此儘可能不要在service方法體外聲明成員變量。
    <%!.....%>  //聲明時要加"!",屬於類成員,最早加載,可寫於任何位置;不加則是腳本的局部變量,必須調用前寫。
    如:  <%!String hello= "Hello, World!" ;%>  //變量的聲明
         <%=hello%>   //變量的調用
         <%! private int counter=0;  public int count(){ return ++counter;} %> //函數的聲明
         <h1><%=count()%></h1> //函數的調用
    聲明規則:
     1) JSP中聲明的變量和方法對應於Servlet中的實例方法和實例變量。這些將被同時請求該頁面的全部用戶所共享;
     2) 在使用變量或方法前須先定義(不是說聲明變量的位置在頁面中要處於使用變量的前面,而是指變量不聲明不能使用);
     3) 聲明的變量或方法的做用域爲當前頁面或包含的頁面;
     4) 語句間以分號分隔。
  

2、JSP代碼段(Scriptlet)

       <% java代碼 %>
    是一段能夠在處理請求時間執行的Java代碼。能夠產生輸出,也能夠是一些流程控制語句。
    在代碼段中定義的變量爲service方法中的局部變量。
    1._jspService()中的局部代碼:
       <%  System. out .println( "Hi,I like JSP." ); %>   //在控制檯打印出,網頁上沒顯示
       <%  out .println( "Hi,I like JSP." ); %>          //打印在網頁上
       <%  Connection conn=DriverManager.getConnection();  Statement st=conn.createStatement();
         String sql= "select * from users" ;               ResultSet rs=st.executeQuery(sql);
          //……
        %>
     問:可否在JSP腳本里定義方法?
     答:不能! //腳本至關於方法,不能在方法裏定義方法
        <%! public void helloworld(){}%>  //能夠聲明方法
        <% public void helloworld(){}%>  //編譯出錯;腳本不能定義方法
    2.比較:
         <%! int i=100;%>     //成員變量
         <%  int i=101;%>     //_jspService()方法中的局部變量
         <%=i%>  //同一文件裏,局部變量優先
    3.腳本小程序規則:
      1) 你使用的腳本語言決定了腳本小程序的規則;
      2) 語句間以分號分隔;
      3) 可使用默認的對象、import進的類、declaration聲明的方法和對象以及useBean tag中聲明的對象。

  

3、JSP表達式(expression)

        <%=……%>   // "="號
    在JSP請求處理階段計算他的值,表達式生成的代碼是Service方法中的一個代碼片段。
    JSP對於聲明的處理:一、計算表達式的值
                    二、將值轉換成String
                    三、用 out .println發送標籤;把數據輸出至頁面的當前位置
       <%= "Hello,JSP world!" %>     //out.println("Hello,JSP world");
       <%=name%>                   //<%!String name="GiGi";%> out.println(name);
       <%= new java.util.Date()%>   //out.println(new java.util.Date());
    表達式規則:
      1) 你使用的腳本語言決定了腳本小程序的規則;
      2) 執行的順序爲從左到右;
      3) 分號不能用於表達式。
  
4、JSP指令(direction)
    指令用於從JSP發送信息到容器上。用來設置全局變量,聲明類,要實現的方法和輸出內容等。
    指令在JSP整個文件內有效。它爲翻譯階段提供了全局信息。
        <%@......%>  // "@"符號
    指令包括:page、include、taglib
    1.page指令
         import、session、errorPage、isThreadSafe
      頁面的語言、內容類型、字符集、頁面編碼
         <%@page language= "java" contentType= "text/html; charset=gbk" pageEncoding= "gbk" %>
         language:java惟一值,表示腳本中使用的編程語言
         contentType:設置了內容的類型和靜態頁面的編碼 (告訴瀏覽器以什麼編碼顯示)
         pageEncoding:頁面自己的編碼格式 (寫頁面時用的編碼格式)
         上面的代碼等價於servlet裏: response.setContentType( "text/html; charset=gbk" );
      import:導入其餘的包和類; 其中,JSP默認導入的包是java.lang.*
         <%@page import= "java.util.Date" %> //具體的包和類
         <%@page import= "java.sql.*" %>     //包下的全部類
         <%@page import= "java.util.*, java.io.*, java.net.*" %> //連寫,逗號分隔
      Session:指示當前的jsp是否參與會話 (默認爲 true ; 參與會話)
         經過指令使當前頁面與session不可會話:    <%@page session= "false" %>
         session= "true" 時,可用內建對象session直接訪問會話,例如:
         <%  session.setAttribute( "username" , "maxwell" );
             String name = (String)session.getAttribute( "username" ); %>
         <%=name%>
      errorPage:
         isErrorPage:Jsp頁面中出現異常的處理方式
         對於有可能出現異常的頁面:
             <%@page errorPage= "error.jsp" %> //異常時會跳轉處處理異常的頁面;這頁面本身寫
             在有可能異常的地方打印緣由:  throw new Exception( "數據庫鏈接出錯" );
         對於處理異常的頁面(error.jsp)裏:
             <%@page isErrorPage= "true" %>,其中使用<%=exception.getMessage() %>把異常信息打印出來
      isThreadSafe——此屬性已經再也不使用(已廢棄)
         當前Jsp頁面是否線程安全    default ---> true
         <%@page isThreadSafe= "true" %>  //普通的Servlet,能夠併發處理用戶請求
         <%@page isThreadSafe= "false" %> //至關於Servlet實現了SingleThreadModel
    2.include指令
         把目標頁面的內容包含到當前頁面,產生頁面疊加之後的輸出效果 //至關於將兩個頁面合併;編譯時就包含進來
         <%@include file= "foot.jsp" %> //可插入任意位置
    3.taglib指令
         留在JSTL裏講解。
  
5、JSP中的註釋
    1.java格式註釋
       編譯器會忽略掉此類註釋中的內容(客戶端的源碼看不見)
       <%-- JSP註釋;可多行 --%>
       <% // java 單行註釋 %>
       <% /* java multi lines comments */ %>
       <% /**java 特有的註釋*/ %>
    2.html風格註釋
       編譯器會執行此類註釋中的代碼(客戶端的源碼看得見)
       <!-- html風格註釋 -->  等價於 out .println( "<!-- html風格註釋 -->" )
       這種註釋方式很差的地方就是當頁面註釋信息太多的時候會增大服務器的負荷。
       還有註釋信息須要在網絡上傳輸,從而下降效率;內部程序員的測試數據通常不能寫在這種註釋中,以避免泄露。
  
6、動做(Action)
     <jsp:actionName attributeName=attributeValue/>
    JSP的動做包括:
      forward、include、useBean、setProperty、getProperty
    1.forward動做
      形式:<jsp:forward page= "another.jsp" />
           等價於 Servlet中經過RequestDispatcher.forward();
      能夠傳參數
          <jsp:forward  page= "another.jsp" >
             <jsp:param name= "name" value= "maxwell" />
             <jsp:param name= "age" value= "20" />
          </jsp:forward>
    2.Include動做
      形式:<jsp:include page= "another.jsp" />
           等價於 Servlet中經過RequestDispatcher.include();
       Include動做也能夠傳參數
           <jsp:include  page= "b.jsp" flush= "true" >
              <jsp:param name= "name" value= "narci" />
           </jsp:include>
       與<%@include file= "" %>比較:
          include動做在運行期處理(include指令編譯期),jsp:include包含的是所包含URI的響應,而不是URI自己。
          這意味着:jsp:include 對所指出的 URI 進行解釋,於是包含的是生成的響應。
          對於頁面是靜態內容,這沒有太大的關係。但若是是動態內容,include動做可傳參數。
       flush 屬性
          flush 指示在讀入包含內容以前是否清空任何現有的緩衝區。
          JSP 1.1 中須要 flush 屬性,所以,若是代碼中不用它,會獲得一個錯誤。
          可是,在 JSP 1.2 中, flush 屬性缺省爲 false
          建議:因爲清空大多數時候不是一個重要的問題,所以,對於 JSP 1.1,將 flush 設置爲 true
               而對於 JSP 1.2 及更高版本,將其設置爲 false 或不設置(用默認值)。
  
 
JSP的生命週期
     1) 每個JSP都會對應有一個servlet生成
     2) 在 %tomcat%/work/Catalina/localhost/工程名/org/apache/jsp 目錄下可找到對應生成的 Servlet 文件
     3) 通常而言,每個JSP對應的servlet都有以下的生命週期方法:
  
1、 _jspInit()方法
     JSP容器第一次裝載jsp文件時調用一次
     public void _jspInit(){……}
  
2、 _jspService()方法
     每當服務器接收到對該jsp的請求,都須要調用一次該方法一次。
     public void _jspService(HttpServletRequest request, HttpServletResponse response)
        throws java.io.IOException, ServletException { ……}
  
3、 _jspDestroy()方法
     jsp文件被修改時,JSP容器會銷燬舊的jsp文件對應的對象,從新裝載一次更新後的jsp文件的內容(只調用一次)。
     public void _jspDestroy(){……}
  
 
JSP處理過程:JSP源文件處理分紅二個階段:
  1) JSP頁面轉換階段:
     頁面被編譯成一個Java類,全部的HTML標記和JSP標記都被轉換建立一個Servlet。這時,腳本和表達式尚未被執行;
  2) 請求處理階段:發生在服務器,將一個客戶端請求指向JSP頁面。
     一個請求對象建立、解析以及提交給編譯好的JSP對應的servlet。
     當這個servlet處理請求的時候它執行先前在JSP中定義的處理腳本小程序和表達式。
  
使用腳本代碼的缺點和指導方針
  1) 缺點:
     a. 過分使用腳本代碼使用JSP頁面混亂和難以維護;
     b. 腳本代碼下降JSP二個主要的優勢:軟件重用和代碼分開
  2) 指導方針:只在組件功能無能爲力或須要有限的腳本時使用。
  
 
day2
   POJO: Plain Old Java Object  --> 簡單傳統的Java對象
   Java Bean: 組件、構件的規範(屬性,提供 get / set 方法;還可包含其餘方法)
JSP調用JavaBean
   經過引入JavaBean,JSP才能較好的把頁面展現與業務邏輯分離。
   其中,業務邏輯放到後臺的Java Bean中,減小JSP中的腳本代碼,有利於程序的可維護性與可重用性。
1、Java Bean
      a.無參構造器(也是默認的構造方法)
      b.標準的getter、setter方法
      c.如要進行網絡傳輸(支持RMI),需實現Serializable接口
2、如何在JSP中使用JavaBean?
    1.定義Java Bean
      形式:<jsp:useBean id = "BeanName" class = "className"  sope= "範圍域" >
         id   ——聲明bean對象的標識符,方便其餘地方使用
         class ——bean對象的類型,注意要使用徹底限定名
         scope——java bean對象的共享範圍(page、request、session、application)
            page:當前頁面範圍(範圍最小,生命週期最短)
            request:同一個請求範圍 (forward,include)
            session:同一個會話(30分鐘不使用,會自動結束)
            application:同一個應用(範圍最大,生命週期最長)  ServletContext
      例如:  SuperGirl <jsp:useBean id= "girl" class = "com.tarena.vo.SuperGirl" scope= "session" />
      等價於:<% SuperGirl girl=(SuperGirl)session.getAttribute( "girl" );
            if (girl== null ){
               girl = new SuperGirl(); //對應 id 和 class
               session.setAttribute( "girl" ,girl);  //對應 scope 的值
            } %>
      能夠用表達式得到bean的值:  <%=girl.getName();%>
    2.對JavaBean的屬性賦值
      形式:<jsp:setProperty name= "JavaBean對象名" property= "JavaBean屬性名" value= "屬性值" />
         例子:   <jsp:setProperty name= "girl" property= "name" value= "Lily" />
         等價於: <% girl.setName( "Lily" );%>
      能夠嵌套JSP表達式:
         <jsp:setProperty name= "girl" property= "name"
          value= '<%=request.getParameter("name")%>' />
      Java Bean中的屬性名與form中輸入域的名字保持一致的話,可使用通配符*,一次設置全部字段的值。
         <jsp:setProperty name= "" property= "*" />
    3.獲取JavaBean的屬性值
      形式:<jsp:getProperty name= "" property= "" />
         name:標識具體的Bean對象,這與<jsp:useBean>標準動做中的id值相匹配
         property:標識屬性中的標識符。
  
JSP中的異常處理
1、 try / catch / finally /throws/ throw
     // 在局部代碼裏處理異常。
2、errorPage, isErrorPage
     // 在整個頁面處理異常。
    1.errorPage
      形如: <%@page errorPage= "error.jsp" %>
      表示:須要錯誤處理的頁面
    2.isErrorPage
      形如: <%@page isErrorPage= "true" %>
      指示:錯誤頁面。其中,有一個隱式對象exception可用: <%=exception%>
           產生(隱含)內建對象exception,可經過它得到異常信息
           <%=exception.getMessage() %> //把異常信息打印出來
3、聲明的方式處理異常
     // 在整個應用處理異常。(範圍比前兩種更大)
    1.配置: 在web.xml進行配置異常處理
       …… <error-page>
            <exception-type>java.lang.ArithmeticException</exception-type>
            <location>/MathError.jsp</location>
          </error-page>
          <error-page>
            <error-code>404</error-code>
            <location>/404.jsp</location>
          </error-page>  ……
    2.複習:Java中的異常——有2種
      受查異常(Checked Exception)
      非受查異常(Unchecked Exception)  Java中的RuntimeException及其子類是不須要處理的( try / catch )
         由於全部的RuntimeException老是能夠經過優化代碼來避免,所以,這種異常被稱爲 "Unchecked Exception"
    3.思考:
      三種異常處理方式同時啓動用,那個優先級高? 做用域越小,優先級越高。
    注意:要使得頁面自動跳轉到錯誤頁面,必須關閉瀏覽器的 "顯示友好HTTP錯誤信息" 選項。
       public void _jspService(HttpServletRequest request, HttpServletResponse response)
         throws java.io.IOException, ServletException { /*只處理這兩種兼容的異常*/ …… }
  
 
安全的系統(企業級應用):
    1.身份認證(合法用戶)  --登陸
    2.受權(靜態)        --定義權限
    3.訪問控制(動態)     --比較
    4.安全審計(日誌)     --修復bug (只有敏感的部門須要)
JAAS實現安全
    JAAS——Java Authentication and Authorization Service
    (Java認證(Authentication)與受權(Authorization)服務)
    是Java EE規範之一,實現Java EE應用程序安全性的一個重要途徑
    (要求:會使用,沒必要深刻理解)
1、網絡安全的4大要素
    認證——抵禦假冒者(用戶身份的合法性)
    受權——合法用戶擁有的權限
    機密性——防止關鍵數據落入其餘人手中
    數據完整性——抵禦竊聽者(篡改私有數據)
2、對於Http應用是如何進行認證的(Web端的認證方法)?
    四種安全認證: (http協議)basic, form, digest, certificate(證書) + ssl
    HttpMonitor監控受限資源的訪問
3、容器是如何完成認證與受權的呢?
    圖示(容器作了些什麼事情)
    (容器的角度)
4、聲明式安全以及分工
    Servlet的開發者
    應用的管理員
    部署人員
  
5、實戰
   1.定義新用戶與角色
     在Tomcat服務器中定義:    %TOMCAT_HOME%/conf/tomcat-user.xml
      <?xml version= '1.0' encoding= 'utf-8' ?>
      <tomcat-users>
       <role rolename= "manager" />
         <role rolename= "admin" />
         <user username= "maxwell" password= "123" roles= "admin,manager" />
         <user username= "lily" password= "iloveyou" roles= "manager" />
      </tomcat-users>
     爲何tomcat可使用tomcat-users.xml做爲它保存用戶和角色信息的文件?緣由是在server.xml中,有如下配置:
      <Resource name= "UserDatabase" auth= "Container"  type= "org.apache.catalina.UserDatabase"
          description= "User database that can be updated and saved"
          factory= "org.apache.catalina.users.MemoryUserDatabaseFactory"
          pathname= "conf/tomcat-users.xml" />
      在DD中指定角色,則需在 web.xml 中配置:
      <security-role>
         <description />
         <role-name>admin</role-name>
      </security-role>
    2.聲明安全性約束(指明受限資源)
      在DD中加入<security-constraint>元素,其中包含了:
        Web資源集合:<web-resource-collection>
        其中包含了url資源以及http方法。
      受權約束:<auth-constraint>
       <security-constraint>
         <display-name>Constraint-all</display-name>
         <web-resource-collection>
            <web-resource-name>all-resources</web-resource-name>
            <description />
            <url-pattern>/admin/*</url-pattern>    //被受權訪問的目錄和文件
            <url-pattern>/security/*</url-pattern>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
         </web-resource-collection>
         <auth-constraint>
            <description />
            <role-name>admin</role-name>
         </auth-constraint>
       </security-constraint>
  
      要注意的規則:
       不要認爲:資源自己受到約束;其實,是資源 + Http方法組合受到約束
       若是配置中不指定<http-method>,說明全部的方法(Get,Post,Trace,Head,Delete,Put,Options等)都受約束;
       當指定了具體的<http-method>,那麼約束只針對該方法,其餘的http方法都不在約束以內;
       <auth-constraint>定義的是哪些角色能夠作出受約束的請求;而不是定義訪問<web-resource-collection>
       沒有<auth-constraint>:任何角色都能訪問;   空的<auth-constraint />任何角色都不能訪問;
       對於不一樣的<security-constraint>,指定的url資源<url-pattern>在相同方法上定義了不一樣的<auth-constrain>,則存在合併規則。
  
      問題:爲何要設置<auth-constraint />元素,使得任何角色的任何人都不能訪問受限資源呢?其意義何在?
         爲了保護資源,只容許內部跳轉去訪問
  
    3.選擇認證方式
      若是是BASIC認證:則無需指定Form表單的action。
      <login-config>
          <auth-method>BASIC</auth-method>
          <realm-name>UserDatabaseRealm</realm-name>
      </login-config>
      若是是FORM認證:
      <login-config>
        <auth-method>FORM</auth-method>
        <form-login-config>
           <form-login-page>/logon/loginForm.jsp</form-login-page>
           <form-error-page>/logon/loginErrorForm.jsp</form-error-page>
        </form-login-config>
      </login-config>
  
      對於Form表單認證
       action的值,用戶名、密碼字段的名稱都是固定的(規範)
       <form method= "POST" action= "j_security_check" >     
         <input type= "text" name= "j_username" >     
         <input type= "password" name= "j_password" >     
         <input type= "submit" value= "Submit" name= "B1" >
       </form>
      標準的表單提交(固定不變):
       action:j_security_check
       name:j_username
       password:j_password
  
 
Day3
內容要點: 1.隱含對象 2.歡迎文件 3 MVC
********************************************************************************************
1、隱含對象
  1.什麼是隱含對象(9個)?
    ————JSP中的隱含對象:不用咱們手工去建立的對象
    類型                    對象名            功能
    ---------------------------------------------------------------------
    JspWriter              out              往瀏覽器寫內容
    HttpServletRequest     request          Http請求對象.
    HttpServletResponse    response         Http響應對象
    PageContext            pageContext      JSP的頁面上下文
    HttpSession            session          會話對象
    ServletContext         application      應用上下文
    ServletConfig          config           JSP的ServletConfig
    Object                 page             頁面實現類的對象(例如: this )
    Exception              exception        含有指令<%@page isErrorPage= "true" %>
  
  2.範圍對象
    其中,有4個是範圍對象: pageContext,request,session,application
    對應<jsp:useBean/>指令的scope分別是:page,reqeust,session,application
    也就是說,指定不一樣scope的bean對象(Java Bean)會被綁定到不一樣的範圍對象中
    // 選擇範圍對象的原則:做用域的範圍越小越好;由於做用域小的生命週期短,有利於性能提升。
    例如:<jsp:useBean id= "stu" class = "vo.Student" scope= "page" />
    表示stu對象被綁定到javax.servlet.jsp.PageContext對象(pageContext)中,其等價的代碼
    <%    Student stu = pageContext.getAttribute( "stu" );
          if (stu== null ) {
           stu= new Student();
           pageContext.setAttribute( "stu" ,stu);
    }%>
  
    1)pageContext對象:
      每個jsp頁面對應着一個pageContext。通常地,在實際應用中,主要是使用它來存取屬性。
      另外,pageContext對象可以存取其餘隱含對象。
     a.pageContext對象存取其餘隱含對象屬性的方法,此時須要指定範圍的參數。
       Object getAttribute(String name, int scope)
       Enumeration getAttributeNamesInScope( int scope)
       void removeAttribute(String name, int scope)
       void setAttribute(String name, Object value, int scope)
      其中,範圍參數有四個,分別表明四種範圍:
       PAGE_SCOPE、REQUEST_SCOPE、SESSION_SCOPE、APPLICATION_SCOPE
     b.PageContext對象取得其餘隱含對象的方法
       Exception getException()           回傳目前網頁的異常,不過此網頁要爲error page,
       JspWriter getOut()                 回傳目前網頁的輸出流,例如: out
       Object getPage()                   回傳目前網頁的Servlet 實體(instance),例如:page
       ServletRequest getRequest()        回傳目前網頁的請求,例如:request
       ServletResponse getResponse()      回傳目前網頁的響應,例如:response
       ServletConfig getServletConfig()   回傳目前此網頁的ServletConfig 對象,例如:config
       ServletContext getServletContext() 回傳目前此網頁的執行環境(context),例如:application
       HttpSession getSession()           回傳和目前網頁有聯繫的會話(session),例如:session
     c.PageContext對象提供取得屬性的方法
       Object getAttribute(String name, int scope)    回傳name 屬性(範圍爲scope;類型爲Object)
       Enumeration getAttributeNamesInScope( int scope)   
                                        回傳全部屬性範圍爲scope 的屬性名稱,回傳類型爲Enumeration
       int getAttributesScope(String name)回傳屬性名稱爲name 的屬性範圍
       void removeAttribute(String name)  移除屬性名稱爲name 的屬性對象
       void removeAttribute(String name, int scope)   移除屬性名稱爲name,範圍爲scope 的屬性對象
       void setAttribute(String name, Object value, int scope)       
                                        指定屬性對象的名稱爲name、值爲value、範圍爲scope
       Object findAttribute(String name)  尋找在全部範圍中屬性名稱爲name 的屬性對象
  
    2)request 對象
      request 對象包含全部請求的信息,
      如:請求的來源、標頭、cookies和請求相關的參數值等等。
      request 對象實現javax.servlet.http.HttpServletRequest接口的,
      所提供的方法能夠將它分爲四大類:
      (1)儲存和取得屬性方法;
       void setAttribute(String name, Object value)      設定name屬性的值爲value
       Enumeration getAttributeNamesInScope( int scope)   取得全部scope 範圍的屬性
       Object getAttribute(String name)   取得name 屬性的值
       void removeAttribute(String name)  移除name 屬性的值
      (2)取得請求參數的方法
       String getParameter(String name)   取得name 的參數值
       Enumeration getParameterNames()    取得全部的參數名稱
       String [] getParameterValues(String name)    取得全部name 的參數值
       Map getParameterMap()              取得一個要求參數的Map
      (3)可以取得請求HTTP 標頭的方法
       String getHeader(String name)      取得name 的標頭
       Enumeration getHeaderNames()       取得全部的標頭名稱
       Enumeration getHeaders(String name) 取得全部name 的標頭
       int getIntHeader(String name)      取得整數類型name 的標頭
       long getDateHeader(String name)    取得日期類型name 的標頭
       Cookie [] getCookies()             取得與請求有關的cookies
      (4)其餘的方法
       String getContextPath()            取得Context 路徑(即站臺名稱)
       String getMethod()                 取得HTTP 的方法(GET、POST)
       String getProtocol()               取得使用的協議 (HTTP/1.一、HTTP/1.0 )
       String getQueryString()            取得請求的參數字符串,不過,HTTP的方法必須爲GET
       String getRequestedSessionId()     取得用戶端的Session ID
       String getRequestURI()             取得請求的URL,可是不包括請求的參數字符串
       String getRemoteAddr()             取得用戶的IP 地址
       String getRemoteHost()             取得用戶的主機名稱
       int getRemotePort()                取得用戶的主機端口
       String getRemoteUser()             取得用戶的名稱
       void getCharacterEncoding(String encoding)    設定編碼格式,用來解決窗體傳遞中文的問題
  
     3)session 對象
      session對象表示目前個別用戶的會話(session)情況。
      session對象實現javax.servlet.http.HttpSession接口,HttpSession接口所提供的方法
       long getCreationTime()             取得session產生的時間,單位是毫秒
       String getId()                     取得session 的ID
       long getLastAccessedTime()         取得用戶最後經過這個session送出請求的時間
       long getMaxInactiveInterval()      取得最大session不活動的時間,若超過這時間,session 將會失效
       void invalidate()                  取消session 對象,並將對象存放的內容徹底拋棄
       boolean isNew()                    判斷session 是否爲 "新" 的會話
       void setMaxInactiveInterval( int interval)  
                                        設定最大session不活動的時間,若超過這時間,session 將會失效
     4)application對象
      application對象最常被使用在存取環境的信息。
      由於環境的信息一般都儲存在ServletContext中,因此常利用application對象來存取ServletContext中的信息。
      application 對象實現javax.servlet.ServletContext 接口,ServletContext接口容器所提供的方法
       int getMajorVersion()              取得Container主要的Servlet API版本
       int getMinorVersion()              取得Container次要的Servlet API 版本
       String getServerInfo()             取得Container的名稱和版本
       String getMimeType(String file)    取得指定文件的MIME 類型
       ServletContext getContext(String uripath)        取得指定Local URL的Application context
       String getRealPath(String path)    取得本地端path的絕對路徑
       void log(String message)           將信息寫入log文件中
       void log(String message, Throwable throwable)    將stack trace 所產生的異常信息寫入log文件中
  
  3.其餘對象:
     1)page 對象
      page對象表明JSP自己,更準確地說page對象是當前頁面轉換後的Servlet類的實例。
      從轉換後的Servlet類的代碼中,能夠看到這種關係: Object page = this ;
      在JSP頁面中,不多使用page對象。
     2)response 對象
      response 對象主要將JSP 處理數據後的結果傳回到客戶端。
      response 對象是實現javax.servlet.http.HttpServletResponse 接口。response對象所提供的方法。
     a.設定表頭的方法
       void addCookie(Cookie cookie)                新增cookie
       void addDateHeader(String name, long date)   新增 long 類型的值到name標頭
       void addHeader(String name, String value)    新增String類型的值到name標頭
       void addIntHeader(String name, int value)    新增 int 類型的值到name標頭
       void setDateHeader(String name, long date)   指定 long 類型的值到name標頭
       void setHeader(String name, String value)    指定String類型的值到name標頭
       void setIntHeader(String name, int value)    指定 int 類型的值到name標頭
     b.設定響應狀態碼的方法
       void sendError( int sc)                       傳送狀態碼(status code)
       void sendError( int sc, String msg)           傳送狀態碼和錯誤信息
       void setStatus( int sc)                       設定狀態碼
     c.用來URL 重寫(rewriting)的方法   
       String encodeRedirectURL(String url)         對使用sendRedirect()方法的URL予以編碼
     3) out 對象
      out 對象的類型是javax.servlet.jsp.JspWriter,該類從java.io.Writer類派生,以字符流的形式輸出數據。
      out 對象其實是PrintWriter對象的帶緩衝的版本(在 out 對象內部使用PrintWriter對象來輸出數據),
      能夠經過page指令的buffer屬性來調整緩衝區的大小,默認的緩衝區是8kb。
      out 對象能把結果輸出到網頁上。
      out 主要是用來控制管理輸出的緩衝區(buffer)和輸出流(output stream)。
       void clear( )               清除輸出緩衝區的內容
       void clearBuffer( )         清除輸出緩衝區的內容
       void close( )               關閉輸出流,清除全部的內容
       int getBufferSize( )        取得目前緩衝區的大小(KB)
       int getRemaining( )         取得目前使用後還剩下的緩衝區大小(KB)
       boolean isAutoFlush( )      回傳 true 表示緩衝區滿時會自動清除; false 表示不會自動清除而且產生異常處理
     4)exception對象
      若要使用exception 對象時,必須在page 指令中設定:<%@ page isErrorPage= "true" %>才能使用。
      exception提供的三個方法:
       getMessage()
       getLocalizedMessage()
       printStackTrace( new java.io.PrintWriter( out ))
     5)config 對象
      config 對象裏存放着一些Servlet 初始的數據結構。
      config 對象實現於javax.servlet.ServletConfig 接口,它共有下列四種方法:
       public String getInitParameter(name)
       public java.util.Enumeration getInitParameterNames( )
       public ServletContext getServletContext()
       public Sring getServletName()
  
 
例子:
1.範圍對象比較
<% pageContext 或request 或session 或application.setAttribute( "name" , "maxwell" );
    pageContext.setAttribute( "sex" , "m" );
%>
  
2.輸出對象 out
<% out .println( "Hello JSP!" );%>
<%System. out .println( "Hello JSP!" );%>
getBufferSize() //tomcat default:12k
getRemaining()
flush()
clearBuffer()
  
3.request對象
request:
getProtocol()
getMethod()
getHeader( "User-Agent" )
getCookies()
getRequestURI()
getRequestURL()
getContextPath()
getServletPath()
getPathInfo()
getQueryString()
isRequestedSessionIdFromCookie()
isRequestedSessionIdFromURL()
isRequestedSessionIdValid()
getLocalPort(),getRemotePort()
getRequestDispatcher(),setCharacterEncoding(),getInputStream()
  
4.session對象
session:
getId()
isNew()
invalidate()
setMaxInactiveInterval(10)
  
 
5.響應對象
response:
sendRedirect( "third.jsp" )
sendError(404, "400 Error!" )
6.應用對象
application:
log( "some body visit our website..." );
getMajorVersion()
getMinorVersion()
getServerInfo()
getRequestDispatcher(),getResourceAsStream(),getInitParameter()
  
pageContext:
getAttribute( "name" )
  
config:
getInitParameter( "classNo" )
getServletName()
  
page:
getClass()
  
************************************************************************************************
2、歡迎文件
  
  1.缺省狀況下,一個Web App中的  index.html, index.htm, index.jsp  可做爲默認的歡迎文件.
    當用戶請求沒有指明要訪問的資源時,Web Container會用歡迎文件響應客戶端請求.
  2.手工設置歡迎文件:
    web.xml
    找welcome.jsp,沒找到,繼續往下找
    <welcome-file-list>
      <welcome-file>/welcome.jsp</welcome-file>
      <welcome-file>/welcome1.jsp</welcome-file>
      <welcome-file>/welcome2.jsp</welcome-file>
    </welcome-file-list>
  
 
3、MVC
  MVC:    Model-View-Controller (用戶交互過程:輸入、處理、輸出)
  WEB應用的MVC;優化Web App的結構,使用MVC模式
  Model 1:    JSP + JavaBean(EJB)
  Model 2:    Servlet + JSP + JavaBean(EJB)------>MVC
  
體系結構
  
設計模式
   具體問題提出具體的解決辦法
  
習慣用法
  
 
Day4
內容要點: 1 實現文件上傳  2 數據驗證  3 分頁實現
*****************************************************************************************
1、文件上傳
1.表單形式
<form action= "" method= "POST" enctype= "multipart/form-data" >
   file:<input type= "file" name= "file" /><br/>
   <input type= "submit" />
</form>
  
2.使用HttpMonitor工具:
查看文件上傳時,請求的內容。
  
3.服務器端對上傳文件的處理
例子
fileupload
處理步驟(待補充)
  
知識點:
1)經過HttpServletRequest來傳送文件內容
2)處理request頭,字符串的分析
3)java.io.File API的使用
  
*****************************************************************************************
2、數據驗證
  
如何完成Web App中的數據驗證工做
  
1)客戶端校驗:
輸入域不能爲空,只能是數字,數據長度大於5等等
JavaScript客戶端完成(驗證框架,負責客戶端方面的驗證)
  
2)服務器端校驗:
例如:後臺數據庫要求提交數據惟一性
Java服務器端完成(沒有現成的框架,由於不一樣的項目有不一樣的業務規則)
  
 
重點:
1)分清楚什麼狀況下使用客戶端校驗,什麼狀況下使用服務器端校驗
  
 
***************************************************************************************
3、數據分頁
查詢數據庫時,若是知足條件的記錄不少,該如何返回給頁面?
1.客戶端分頁
   一樣地,使用html/javascript等技術處理。甚至能夠封裝成組件
2.服務器端分頁
   很是重要的,在實際項目中很是須要————性能問題。
這須要結合JDBC/Hibernate/TopLink/EJB等技術實現。
  
查詢分頁
   1)一次性從數據庫中查出全部信息,在內存中做分頁(緩存)
       特色:速度很是快,消耗資源大(內存?)
  
   2)分屢次查詢數據庫,一次查詢的數據量就是一個頁面能夠顯示的數據量
       特色:消耗資源少,相對來講速度慢
  
   3)折衷的方案(一次只取n頁,1<n<總頁數)(部分緩存)
       特色:中庸之道(實現中,置換算法教難)
  
常見的分頁處理方法:定義以下幾個參數
rows:數據庫表中記錄總行數   select count(*) from 表名;
   totalPage:總頁數     (導出屬性:能夠由其餘屬性計算而得) int totalPage = rows / size + 1;
size:每頁顯示的記錄數目    可定製,可寫死
curPageNo:當前頁         客戶端決定
   startRowNo:當前頁在數據庫中的起始行號(導出屬性)        int startRowNo = (curPageNo -1 ) * size;
  
練習:
從新改造Usermanager例子中的查詢全部的用戶的功能(使用分頁)
  
 
Day5
內容要點:  1 EL   2 JSTL
**************************************************************
1、EL(Expression Language----表達式語言)
  爲網頁美工而設,跟java語句類似;儘可能減小java程序的依賴(不能要求美工使用java)
  1.語法
    表達式          vs.    EL表達式語言(JSP2.0)
    <%=name%>     <=>       ${name}
  2.文字
    在 EL 表達式中,數字、字符串、布爾值和 null 均可以被指定爲文字值(常量)。
    字符串能夠用單引號或雙引號定界。布爾值被指定爲 true false
   例子:
    表達式                              值
    -----------------------------------------------------------------------
    ${-168.18}                         -168.18
    ${3.8e-18}                         3.8e-18           //科學計數法
    ${3.14159265}                      3.14159265                 
    ${ "Hello JSP EL!" }                 Hello JSP EL!     等價於 <%= "Hello JSP EL!" %>         
    ${ 'Hello JSP EL...' }               Hello JSP EL...
    ${ true //can be TRUE?            true
    ${ false } //can be FALSE?           false
    ${str== null }                       true              //布爾值的表達式
  
  3.EL 運算符
    類別               運算符
    -------------------------------------------------------------
    算術運算符        +、  -、  *、  /(或 div)、    %(或 mod)
    關係運算符        ==(或 eq)、    !=(或 ne)、    <(或 lt)
                  >(或 gt)、     <=(或 le)、    >=(或 ge)
    邏輯運算符        &&(或 and)、   ||(或 or)、    !(或 not)
    驗證運算符        empty 
      其中,empty 判斷一個變量是否爲 null 或是否包含有效數據:
      if (name== null ||name.equlas( "" ))  等價於  ${empty name} ->    true
   例子:
     表達式                              值
    -------------------------------------------------------------
     ${3+5.1}                           8.1
     ${ "Hello" + ",Tarena!" }              報錯!  // EL的"+"沒有字符串鏈接功能
     ${5*2}                             10
     ${9.3/3}                           3.1
     ${9.3 div 3}                       3.1
     ${8 div 0}                         Infinity // 表示無窮大
     ${9%2}                             1
     ${9 mod 2}                         1
     ${8*6>68? "Yes" : "No" }               No   //三目表達式
    <% String name= "" ;
     request.setAttribute( "name" ,name);      //若是沒有 setAttribute ,則一定是空
    %>
     ${empty name}                      true //對範圍對象內的變量或對象進行判空
  
  4.變量和JavaBean屬性數據輸出
    表達式語言輸出變量,是到範圍對象(pageContext,request,session,application)中查找相應屬性。
    而非直接在頁面中查找實例或局部變量。
   表達式語言查找變量的順序是:
    pageContext -> request -> session->application, 全部範圍都未找到時,賦值 null
  
  5.存取器
    []    ->輸出對象屬性值,輸出數組或集合中對應索引值
    .     ->輸出對象屬性值
   例子:
    <% SuperGirl girl = new SuperGirl();   girl.setName( "Alice" );
       session.setAttribute( "girl" ,girl);  %>  //必定要有這句,設置成範圍對象
    ${girl[ "name" ]}
    ${girl[ 'name' ]}   //拿屬性時,單引跟雙引等價
    ${girl.name}      //這種方法一樣能夠
    
    <%  List aList = new ArrayList();
        aList.add( "China" );  aList.add(girl);  aList.add(168.18);
        session.setAttribute( "aList" , aList); %>
    ${aList[0]}   //使用下標來取值 "China"
    ${aList[1]}   //取得對象的引用地址  還能夠嵌套:${aList[1]['name']}
    ${aList[3]}   //下標越界,不會報錯;只是取不出值
    
    <%  Map map = new HashMap();
        map.put( "name" , "Kitty" );  map.put( "age" , "25" );  map.put( "date" , new Date());
        map.put( "aList" , aList);
        session.setAttribute( "map" , map); %>
    ${map.date}     ${map[ "date" ]}     //這兩個等效
    ${map.aList[0]} ${map[ "aList" ][0]} //這兩個也等效
    ${map.aList[1][name]}              //嵌套取值
  
  6.隱含對象
    el提供了本身的一套隱含對象,方便在頁面內對各類經常使用數據信息的訪問.
     EL隱藏對象                         JSP隱藏對象
    --------------------------------------------------------------------------------
     pageScope                         pageContext
     requestScope                      request
     sessionScope                      session
     applicationScope                  appication
  
     param:               request.getParameter()
     paramValues:         在提交表單裏,有多個輸入域同名getParameterValues
     header:              request.getHeader() 按照key-value的形式取出;value:是一個String類型的值
     headerValues          按照key-value的方式取出,可是headerValues裏面的value是一個String類型的數組
     cookie                request.getCookies()
     initParam             context param
  
   例子:
     1)超女登記信息 
       enroll.html
       <form action= "index.jsp" method= "post" >
         <table border= "1" >
         <tr><td>姓名:</td>
             <td><input type= "text" name= "name" ></td></tr>
         <tr><td>年齡:</td>
             <td><input type= "text" name= "age" ></td></tr> 
         <tr><td>城市:</td>
             <td><input type= "text" name= "city" ></td>  </tr> 
         <tr><td align= "center" colspan= "2" ><input type= "submit" value= "提交" ></td></tr>
         </table>
       </form>
  
       index.jsp
       <jsp:useBean id= "SuperGirl" class = "vo.SuperGirl" scope= "page" ></jsp:useBean>
       <jsp:setProperty name= "SuperGirl" property= "name" value= "${param.name}" />
       <jsp:setProperty name= "SuperGirl" property= "age"  value= "${param.age}" />
       <jsp:setProperty name= "SuperGirl" property= "city" value= "${param.city}" />
       <table border= "1" >   <% //把設置輸出出來 %>
         <tr><td>姓名:</td>
             <td>${SuperGirl.name}</td></tr>
         <tr><td>年齡:</td>
             <td>${SuperGirl.age}</td></tr> 
         <tr><td>城市:</td>
             <td>${SuperGirl.city}</td></tr> 
       </table>
  
     2)範圍對象
       <%  pageContext.setAttribute( "name" , "page" );
         request.setAttribute( "name" , "request" );
         session.setAttribute( "name" , "session" );
         application.setAttribute( "name" , "application" ); %>
  
       ${name}    // pageContext -> request -> session->application
       ${pageScope.name}
       ${requestScope.name}
       ${sessionScope.name}
       ${applicationScope.name}
  
     3)paramValues
       在enroll.html加入: 興趣
         <table>
       <input type= "checkbox" name= "habit" value= "Reading" />讀書
       <input type= "checkbox" name= "habit" value= "Game" />遊戲
       <input type= "checkbox" name= "habit" value= "Music" />音樂
         </table>
       //提交後,獲取輸入內容
       ${paramValues.habit[0]}
       ${paramValues.habit[1]}
       ${paramValues.habit[2]}
  
     4)initParam
       web.xml
       ...
       <context-param>
         <param-name>server</param-name>
         <param-value>Tomcat5.5</param-value>
       </context-param>
       ...
       ${initParam.server}
  
     5)header
       ${header[ "host" ]}
       ${header[ "accept" ]}
       ${header[ "user-agent" ]}
  
 
  7.能夠自由設置是否支持表達式語言
    <%@page isELIgnored= "false" %> : default : false  可使用EL,改爲 true 以後,寫EL就會報錯
  
    配置web.xml也可達到一樣的效果(同時存在,那種起做用?)
    (禁用腳本和EL)  默認都是 false
    ...
    <jsp-config>
      <jsp-property- group >
        <url-pattern>*.jsp</url-pattern>
        <el-ignored> true </el-ignored>               //設置成全部jsp文件都禁用EL
        <scripting-invalid> true </scripting-invalid> //設置成禁用腳本
      </jsp-property- group >
    </jsp-config>
    ....
    頁面的page指令設置isELIgnored屬性的優先級比web.xml中<el-ignored>設置的高(固然是範圍小的生效)
  
 
***************************************************************************************
2、JSTL(JSP Standard Tag Library )
  減小java代碼,簡化頁面編寫;功能封裝,提升可重用性
  1.如何使用JSTL
    1)對於Java EE以前(即J2EE規範1.4及以前版本)
      a、複製jstl的jar包(jstl.jar,standard.jar)到/WEB-INF/lib
      b、在使用jstl功能的jsp頁面中增長指令
         <%@taglib prefix= "c" uri= "http://java.sun.com/jsp/jstl/core" %>   //核心標籤庫
         <%@taglib prefix= "x" uri= "http://java.sun.com/jsp/jstl/xml" %>   
         <%@taglib prefix= "fmt" uri= "http://java.sun.com/jsp/jstl/fmt" %>
         <%@taglib prefix= "sql" uri= "http://java.sun.com/jsp/jstl/sql" %>  //數據庫標籤庫
         <%@taglib prefix= "fn" uri= "http://java.sun.com/jsp/jstl/functions" %>
         //prefix 表前綴(可改,但一般按這寫的用); uri 指向標籤庫的入口
    2)Java EE規範把jstl做爲規範的一部分
      因此如今的jstl-1.2已經包含了原來的jstl.jar , standard.jar
  
  2.core:核心標籤庫
    通常用途
    在JSTL中,通常用途的標籤主要是指具備輸出,設置變量,和錯誤處理等功能的標籤,他們在jsp中使用比較頻繁,它們有:
   -----------
   |a、<c: set >|
   -----------
    語法:<c: set value= "value" var = "varName" [scope= "{page|request|session|application}" ]/ >
         <c: set value= "value" target= "target" property= "propertyName" / >
    這個標籤用於在某個範圍(page,request,session,application)裏面設置特定的值
    (默認爲page),或者設置某個已經存在的javabean的屬性。
    例子:
      <c: set var = "counter" value= "200" />
      ${counter} //輸出
      
      <c: set var = "tarena" >Tarena It Traning Ltd.</c: set >
      ${tarena}
  
    能夠指定範圍,默認是page
     <c: set value= "20" var = "maxIdelTime" scope= "session" />
     ${maxIdelTime}
  
    設置JavaBean的值
     <jsp:useBean id= "girl" class = "vo.SuperGirl" />
     <c: set value= "Shirly" target= "${girl}" property= "name" />
     <td>girl.name</td>
     <td>${girl.name}</td>
  
   --------------
   |b、<c:remove>|
   --------------
   語法:
     <c:remove var = "varName" [scope= "{page|request|session|application}" ]/ >
     它的做用是刪除某個變量或者屬性。
   例子:
     <c: set value= "10000" var = "maxUser" scope= "application" />
     <c: set value= "10" var = "count" scope= "session" />
     <c: set value= "10" var = "count" />
     ${maxUser}
     ${count}
     <c:remove var = "maxUser" scope= "application" />
     <c:remove var = "count" scope= "session" />
     ${maxUser}
     ${count}
  
   -----------
   |c、<c: out >|
   -----------
   語法:<c: out value= "value" [escapeXml]= "{true|false}" [ default = "defaultValue" ]/>
   注意:escapeXml的做用是是否將代碼交給xml解析器解釋, true 爲交給xml解析器解釋(默認), false 爲交給瀏覽器解釋。
       default 定義缺省值。
  
   例子:
     <c: set var = "sessionZhang3" value= "zhang3-s" scope= "session" />
     <c: set var = "table" value= "<table><tr><td>sessionZhang</td></tr></table>" scope= "page" />
     <c: set var = "requestZhang3" value= "zhang3-r" scope= "request" />
     <c: out value= "如下輸出前面設置的屬性<br>" escapeXml= "false" />
  
     <td colspan=2>
         <c: out value= "${sessionZhang3}" /><br>
         <c: out value= "${table}" escapeXml= "false" /><br> //輸出表格;escapeXml="true"時只顯示字符串
         <c: out value= "${requestZhang3}" /><br>
         <c: out value= "${nodefined}" default = "沒有nodefined這個變量" />
     </td>
  
   -------------
   |d、<c: catch >|
   -------------
   它的做用是捕捉由嵌套在它裏面的標籤所拋出來的異常。相似於<% try {} catch {}%>
   語法:<c: catch [ var = "varName" ]>nested actions</c: catch >
   例子:
     <c: catch var = "error" ><% Integer.parseInt( "abc" ); %></c: catch >
     <% try { Integer.parseInt( "abc" ); } catch (Exception error) {  } %> //等價
  
      <c: out value= "${error}" />
      <c: out value= "${error.message}" />
      <c: out value= "${error.cause}" />
  
 
   控制語句:
   -----------
   |a、 <c: if >| 
   -----------
   語法:
     <c: if test= "testCondition" var = "varName"
     [scope= "{page|request|session|application}" ]>
        Body內容
     </c: if // 注:沒有 else
   例子:
      <c: set var = "age" value= "16" />
      <c: if test= "${age<18}" >
         <h1 align=center>您還沒有成年,不能進入遊戲中心!</h1>
      </c: if >
  
   --------------
   |b、<c:choose>|
   --------------
   例子:
     <c: set var = "tax" value= "5000" />
     <c:choose>
          <c:when test= "${tax <=0}" >
               您今年沒有納稅!
          </c:when>
          <c:when test= "${tax<=1000&&tax>0}" >
            您今年繳納的稅款爲${tax},加油!
          </c:when>
          <c:when test= "${tax<=3000&&tax>1000}" >
            您今年繳納的稅款爲${tax},再接再勵哦!
          </c:when>
          <c:otherwise>
            您今年納稅超過了3000元,多謝您爲國家的繁榮富強做出了貢獻!
          </c:otherwise>
      </c:choose>
  
   ---------------
   |c、<c:forEach>| 循環
   ---------------
   語法: <c:forEach [ var = "varName" ] items= "collection"  [varStatus= "varStatusName" ]
          [begin= "begin" ] [end= "end" ] [step= "step" ]>
            Body 內容
         </c:forEach>
    items:須要迭代的集合; var :迭代時取集合裏的值;
   例子:
     <%  List aList= new ArrayList();
         aList.add( "You" );       aList.add( "are" );   aList.add( "a" );
         aList.add( "beautiful" ); aList.add( "girl" ); 
         request.setAttribute( "aList" ,aList);  %>
     <center> <table border=1>
        <c:forEach var = "word" items= "${aList}" >
          <tr><td>${word }</td></tr>
        </c:forEach>
     </table> </center>
  
     <c:forEach items= '${header}' var = 'h' >
        <tr>
          <td><li>Header name:<c: out value= "${h.key}" /></li></td>
          <td><li>Header value:<c: out value= "${h.value}" /></li></td>
        </tr>
     </c:forEach>
  
   另一種用法: (相似 for 循環)
    <c:forEach var = "count" begin= "10" end= "100" step= "10" >
        <tr><td>
          <c: out value= "${count}" /><br>
        </td></tr>
    </c:forEach>
  
 
   URL
   ---------------
   |a、<c:import> |
   ---------------
   至關於<jsp:include>
    <c:import url= "footer.jsp" charEncoding= "GBK" >
       <c:param name= "name" value= "Java" />
    </c:import>
  
   -----------
   |b、<c:url>|
   -----------
   用於構造URL,主要的用途是URL的重寫。
     <c:url var = "footer1" value= "footer.jsp" />
     <c:url var = "footer2" value= "footer.jsp" scope= "page" >
         <c:param name= "name" value= "Sofie" />
     </c:url>
     <c: out value= "${footer1}" />
     <c: out value= "${footer2}" />
  
     <c:url var = "next" value= "next.jsp" />
     <a href= "${next}" >next</a><br>
        等價於
     <a href= "<c:url value='next.jsp'/>" >next</a> //在 Html 裏可嵌套 JSTL
  
   ----------------
   |c、<c:redirect>|
   ----------------
    //等價於 <jsp:forward>
     <c:redirect url= "${footer2}" />
   例如:
     <c:url var = "next" value= "next.jsp" />
     <c:redirect url= "${next}" />
  
  3.SQL
    <sql:setDataSource>
    <sql:query>
    <sql:update>
    <sql:param>
  
     <!-- 設置數據源 -->
     <%@page contentType= "text/html; charset=GBK" %>
     <%@taglib uri= "http://java.sun.com/jsp/jstl/core" prefix= "c" %>
     <%@taglib uri= "http://java.sun.com/jsp/jstl/sql" prefix= "sql" %>
       <sql:setDataSource   var = "ds"  driver= "com.mysql.jdbc.Driver"
        url= "jdbc:mysql://localhost:3306/tarena"
        user= "root" password= "11111111" />
  
   a、查詢
     <sql:query var = "rs" dataSource= "${ds}" sql= "select * from users" ></sql:query>
     <c:forEach var = "user" items= "${rs.rows}" >
         <tr>
           <td>${user.userid}</td>
           <td>${user.username}</td>
           <td>${user.password}</td>
           <td>${user.role}</td>
         </tr>
     </c:forEach>
  
   b、插入記錄
     <sql:update dataSource= "${ds}" sql= "insert into users values(101,'maxwell','123','admin')"
      var = "i" ></sql:update>
     <hr>插入${i}條記錄.
  
   c、更新記錄
     <sql:update dataSource= "${ds}"
      sql= "UPDATE users SET username='Gavin King' WHERE userid=101" var = "i" ></sql:update>
     <hr>更新${i}條記錄.
  
  <sql:param>
   做用:設置sql語句中 "?" 表示的佔位符號的值。
  <sql:update dataSource= "${ds}" sql= "UPDATE users SET username=? WHERE userid=?" var = "i" >
     <sql:param value= "Rod Johnson" /> //設第一個問號
     <sql:param value= "100" />         //設第二個問號
   </sql:update>
   參數等價於
   //pstmt.setString(1,"Rod Johnson");
   //pstmt.setInt(2,100);
相關文章
相關標籤/搜索