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>