1. 程式人生 > >JavaWeb學習筆記及案例(一)JSP與EL表示式和JSTL

JavaWeb學習筆記及案例(一)JSP與EL表示式和JSTL

1.JSP

1.1JSP的三大指令

  • page
  • include
  • taglib

指令的寫法

<%@ 指令名字 %>

1.1.1jsp的page指令
1.extends 用於指定jsp翻譯成java檔案後,繼承的父類是誰,一般不改
2.session 值為true或false///控制jsp頁面是否可直接使用session物件;

3.errorPage和isErrorPage

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

錯誤資訊跳轉頁面

errorPage="error.jsp"

錯誤資訊顯示介面error.jsp

isErrorPage=“true”

1.1.2include指令
包含另外一個jsp頁面進來【有先後順序】

index.jsp頁面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="other.jsp" %>
<body>
    第一個頁面
</body>

other.jsp頁面

<body>
    這是other頁面
</body>

tomcat輸出順序:

這是other頁面   第一個頁面 

1.1.3taglib指令

<%@ taglib prefix="" uri="" %>

uri:標籤庫路徑
prefix:標籤庫別名

1.2jsp動作標籤

<body>
    <jsp:forward page=""></jsp:forward>
    <jsp:param value="" name=""/>
    <jsp:include page=""></jsp:include>
</body>

1.jsp:include>>>>>>>>包含指定頁面,動態包含,只拿包含頁面的結果,不拿元素

<jsp:include page="other02.jsp"></jsp:include>

2.jsp:forward >>>>> 跳轉到指定頁面

<jsp:forward page="other02.jsp"></jsp:forward>

3.jsp:param>>>>>> 在包含某個頁面時候,或跳轉某個頁面時候,加入該引數
index.jsp頁面

 <body>
        <jsp:forward page="other02.jsp">
            <jsp:param value="shanghai" name="address"/>
        </jsp:forward>        
 </body>

other02.jsp頁面

<body>
      this is OTHER02
      <br >收到引數是:<br>
      <%= request.getParameter("address")%>
</body>

1.3jsp內建物件
1.九大內建物件

1.pageContext:可以取到其他八個物件===例子:<% pageContext.getSession(); %>
2.request                            3.application
4.out                                5.exception
6.page                               7.config
8.response                           9.session

2.四大作用域:表示這些物件可以存值,取值範圍有限定

<body>
		1.使用作用域儲存資料<br>
		<%
		    pageContext.setAttribute("name", "page");
		    request.setAttribute("name", "request");
		    session.setAttribute("name", "session");
		    application.setAttribute("name", "application");
		%>
		取出四個作用域的值<br>
		<%= pageContext.getAttribute("name") %>
		<%= request.getAttribute("name") %>
		<%= session.getAttribute("name") %>
		<%= application.getAttribute("name") %>
</body>

3.四個作用域的區別

	*pageContext: 作用域值僅限當前頁面
    *request: 作用域值僅限一次請求,只要伺服器做出響應,該域的值就沒有了;
    *session: 作用域限於一次會話
    *application: 整個工程都可以訪問,伺服器關閉後就不能訪問

4.response 和 out 區別
緩衝區的區別,如下:

<body>
      這是other05頁面<br>
      <%
         out.write("這是使用out輸出的內容");
      %>
      <br>
      <%
         response.getWriter().write("這是使用response輸出的內容");
      %>
</body>

【面試】首先輸出:這是使用response輸出的內容原因?
原因:首先會把out輸出的內容放到response的緩衝區去;所以會首先輸出response本身要輸出的內容,然後輸出out的內容

2.EL表示式

為了簡化jsp程式碼而出現
格式:${表示式}
程式碼例項:運用EL取值

<body>
  【存值】<br>
   <% 
        pageContext.setAttribute("name", "pageContext存值");
        request.setAttribute("name", "request存值");
        session.setAttribute("name", "session存值");
        application.setAttribute("name", "application存值");
   %>
   【普通取值】<br>
   <%=pageContext.getAttribute("name") %><br>
   【EL取值】<br>
   ${pageScope.name}
   ${requestScope.name}
   ${sessionScope.name}
   ${applicationScope.name}
</body>

執行結果

【存值】
【普通取值】
pageContext存值
【EL取值】
pageContext存值 request存值 session存值 application存值

2.1List取值

<body>
    <%
          ArrayList list = new ArrayList();
          list.add(111);
          list.add("222");
          pageContext.setAttribute("li", list);
    %>
    ${li[0]},${li[1]}
</body>

結果111,222
2.2map取值
把值存到pageContext的作用域中

pageContext.setAttribute("map", map);
<body>
    <%
        Map map = new HashMap();
        map.put("name", "zhangsan");
        map.put("age", 23);
        map.put("address.a","Bj");
        pageContext.setAttribute("map", map);
    %>
    ${map.name},${map.age },${map["address.a"]}
</body>

結果zhangsan,23,Bj
注意

<%
    pageContext.setAttribute("name", "zhangsan");
    session.setAttribute("name", "lisi");
    %>

1.先從page裡面找,沒有再去request裡面去找>session>application

${name}

輸出結果zhangsan

2.從指定session中取值

${sessionScope.name }

輸出結果從指定session中取值 lisi

2.3EL表示式的11個內建物件【面試題】

1.pageContext

作用域相關物件

2.pageScope
3.requestScope
4.sessionScope
5.applicationScope

頭資訊相關物件

6.header
7.headerValues

引數資訊相關物件

8.param
9.paramValues

10.cookie

全域性初始化引數

11.initParam

3.JSTL

3.1引入
1.匯入jar檔案到webcontent/web-inf/lib下【jstl.ajr和standard.jar】
2.引入jstl1.1版本【alt+/】

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

3.2JSTL基本用法
1.常用標籤
—set
var:宣告一個變數
value:儲存的值為zhangsan
scope:代表存到指定的域中,預設存在page域中

<c:set var="name" value="zhangsan" scope="session"></c:set>    <!-- //存值 -->
${sessionScope.name}
<!--${name} -->        <!-- 取值 -->

結果:zhangsan

–if
test="${EL表示式}":如果滿足if裡的el表示式,則執行<c:if></c:if>裡的語句【不存在else】;
var:定義一個變數接受返回的結果
scope:結果存在哪個域裡

<c:set var="age" value="17"></c:set>
<c:if test="${age>16}" var="flag" scope="session">對,年齡大於16歲</c:if>
${flag}

結果:對,年齡大於16歲 true
—foreach

<c:forEach begin="1" end="10" step="2" var="i"> 
    ${i}
</c:forEach>

結果:1 3 5 7 9
item:要遍歷的物件,【裡面必須接收EL表示式】
var:遍歷得到的每一個元素,使用var去接收;

<%
    ArrayList list = new ArrayList();
    list.add(new Person("張三",23));
    list.add(new Person("張四",24));
    list.add(new Person("張五",25));
    
    pageContext.setAttribute("l", list);
    %>
    <c:forEach var="i" items="${l}">
        ${i.name},${i.age}
    </c:forEach>

輸出結果:張三,23 張四,24 張五,25
4.三個知識點的綜合案例分析—一個簡單的學生管理系統
第一步:在WebContent下建立一個登入頁面Login.jsp

<body>
    <h2>歡迎使用學生管理系統</h2>
    <form action="LoginServlet" method="post">
           賬號:<input type="text" name="username"><br>
           密碼:<input type="password" name="password"><br>
           <input type="submit" value="登入">
    </form>
</body>

第二步:建立一個用於處理登入邏輯的servlet,這裡命名為LoginServlet

/**
 * @author ZHENG
 *	用於處理登入的Servlet
 */
public class LoginServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//處理提交資料為中文的情況
		request.setCharacterEncoding("UTF-8");
		//取資料
		String userName = request.getParameter("username");
		String passWord = request.getParameter("password");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request,response);
	}
}

第三步:建立資料庫和Dao
1.建立一張使用者表【t_user】,用來登入管理系統;
2.建立學生資訊表【t_stu】,登入後用來查詢等操作
3.建立UserDao介面,並建立UserDaoImpl實現這個介面;

/**
 * @author ZHENG
 *	對使用者表的訪問
 */
public interface UserDao {
	/**
	 * 簡單的實現,如果成功返回True
	 * 登入失敗返回false
	 */
	boolean login();
}

【XX】已經提前做好的JDBCUtil整合環境和jdbc的配置檔案
在這裡插入圖片描述

public class JDBCUtil {
	
	static String driverClass = null;
	static String url = null;
	static String name = null;
	static String password= null;
	
	static{
		try {
			//1.建立一個屬性配置物件
			Properties properties = new Properties();
			
			//2.使用類載入器,讀取src下的資原始檔
			InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
			properties.load(is);
			
			driverClass = properties.getProperty("driverClass");
			url = properties.getProperty("url");
			name = properties.getProperty("name");
			password = properties.getProperty("password");
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * @return
	 */
	public static Connection getConn(){
		Connection conn = null;
		try {
			Class.forName(driverClass);
			conn = DriverManager.getConnection(url, name, password);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return conn;
	}
	public static void release(Connection conn , Statement st , ResultSet rs){
		closeRs(rs);
		closeSt(st);
		closeConn(conn);
	}
	public static void release(Connection conn , Statement st){
		closeSt(st);
		closeConn(conn);
	}

	private static void closeRs(ResultSet rs){
		try {
			if(rs != null){
				rs.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			rs = null;
		}
	}
	
	private static void closeSt(Statement st){
		try {
			if(st != null){
				st.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			st = null;
		}
	}
	
	private static void closeConn(Connection conn){
		try {
			if(conn != null){
				conn.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			conn = null;
		}
	}
}

jdbc.properties配置檔案

driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost/stus
name=root
password=123456

第四步:建立UserDaoImpl實現UserDao這個介面

public class UserDaoImpl implements UserDao {
	@Override
	public boolean login() {
		try {
			//獲取連線
			Connection conn = JDBCUtil.getConn();
			//判斷是否連線成功
			System.out.println("資料庫狀態:"+ conn.isClosed());
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return false;
	}
}

5.實戰小專案:學生資訊管理系統
提前做好的JDBCUtil整合環境和jdbc的配置檔案

成型預覽:
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

第一步:建立Login.jsp,並且搭配一個LoginServlet來獲取使用者登入資訊;

<body>
    <h2>歡迎使用學生管理系統</h2>
    <form action="LoginServlet" method="post">
                賬號:<input type="text" name="username"><br>
                密碼:<input type="password" name="password"><br>
          <input type="submit" value="登入">
    </form>
</body>

第二步:建立使用者表和學生資訊表

第三步:建立UserDao,定義登入方法,並建立UserDaoImpl實現登入的方法;

/**
 * @author 
 *	對使用者表的訪問
 */
public interface UserDao {
	/**
	 * 簡單的實現,如果成功返回True
	 * 登入失敗返回false
	 */
	boolean login(String userName, String passWord);
}
public class UserDaoImpl implements UserDao {
	@Override
	public boolean login(String userName,String passWord) {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conn = JDBCUtil.getConn();//1.獲取連線
			
			String sql = "select * from t_user where username=? and password=?";//2.sql的查詢語句
			
			ps = conn.prepareStatement(sql);//3.獲取sql語句,建立ps物件
			ps.setString(1, userName);
			ps.setString(2, passWord);
			
			/*  ps.executeUpdate();//增刪改使用   */
			rs = ps.executeQuery();//4.執行sql>>>>>>/*查詢用*/	
			
			return rs.next();//5.若成功,移到下一條記錄,表明存在這個記錄
			/*//判斷是否連線成功
			System.out.println("資料庫狀態:"+ conn.isClosed());
			*/
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			//6.關閉
			JDBCUtil.release(conn, ps, rs);
		}
		return false;
	}
}

第四步:在LoginServlet訪問UserDao,判斷登入結果;

第七步已經實現

第五步:建立stu_list.jsp,當用戶成功登入則跳轉到該頁面;

第八步已經實現

第六步:定義學生StuDao,並建立StuDaoImpl實現該介面;

/**
 * @author ZHENG
 *	查詢所有的學生資訊
 *	@return List集合
 */
public interface StuDao {
	List<Student> findAll();
}
public class StuDaoImpl implements StuDao {

	@Override
	public List<Student> findAll() {
			List<Student> list = new ArrayList<Student>();
			Connection conn = null;
			PreparedStatement ps = null;
			ResultSet rs = null;
			try {
				conn = JDBCUtil.getConn();//1.獲取連線
				String sql = "select * from t_stu";
				ps = conn.prepareStatement(sql);
				rs = ps.executeQuery();
				//迴圈獲取資訊,一個學生的
				while(rs.next()){
					Student s = new Student();
					s.setId(rs.getInt("id"));
					s.setAge(rs.getInt("age"));
					s.setName(rs.getString("name"));
					s.setGender(rs.getString("gender"));
					s.setAddress(rs.getString("address"));
					
					list.add(s);
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}finally{
				//6.關閉
				JDBCUtil.release(conn, ps, rs);
			}
		return list;
	}

}

第七步:在LoginServle中先查出所有的學生,把查到的學生集合存到作用域中,跳轉到stu_list.jsp;

/**
 * @author ZHENG
 *	用於處理登入的Servlet
 */
public class LoginServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//1.處理提交資料的中文
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=utf-8");
		//2.獲取客戶端提交的資訊
		String userName = request.getParameter("username");
		String passWord = request.getParameter("password");
		//3.建立UserDaoImpl的物件,呼叫login方法,將前臺接收的資料傳給login;
		UserDaoImpl dao = new UserDaoImpl();
		boolean isSuccess = dao.login(userName, passWord);
		//4.針對dao的返回結果做出響應
		if(isSuccess){
			
			/* //寫到頁面上的話
			response.getWriter().write(userName+"先生,您已成功登入學生管理系統");*/
			
			//4.1查詢所有學生的資訊
			StuDao sim = new StuDaoImpl();
			List<Student> list = sim.findAll();
			//4.2把集合存到Session這個作用域
			request.getSession().setAttribute("list", list);
			//4.3重定向實現頁面跳轉
			response.sendRedirect("stu_list.jsp");
			
		}else{
			response.getWriter().write("抱歉登入失敗");
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request,response);
	}
}

第八步:在stu_list.jsp中取出域集合,然後使用c標籤遍歷集合;

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<title>學生管理資訊頁面</title>
</head>
<body>
    <h2>學生資訊表</h2>
    <table border="1" width="700" cellspacing="0">
        <tr align="center">
            <td>編號</td>
            <td>姓名</td>
            <td>年齡</td>
            <td>性別</td>
            <td>地址</td>
            <td>操作</td>
        </tr>
       <c:forEach items="${list}" var="i"  >
	        <tr align="center">
	            <td>${i.id}</td>
	            <td>${i.name}</td>
	            <td>${i.age}</td>
	            <td>${i.gender}</td>
	            <td>${i.address}</td>
	            <td><a href="stu_list.jsp">更新</a> <a href="#">刪除</a></td>  
	        </tr>
       </c:forEach>
        
    </table>
</body>