1. 指令
* 做用:用於配置JSP頁面,導入資源文件
* 格式:
<%@ 指令名稱 屬性名1=屬性值1 屬性名2=屬性值2 ... %>
* 分類:
1. page : 配置JSP頁面的
* contentType:等同於response.setContentType()
1. 設置響應體的mime類型以及字符集
2. 設置當前jsp頁面的編碼(只能是高級的IDE才能生效,若是使用低級工具,則須要設置pageEncoding屬性設置當前頁面的字符集)
* import:導包
* errorPage:當前頁面發生異常後,會自動跳轉到指定的錯誤頁面
* isErrorPage:標識當前也是是不是錯誤頁面。
* true:是,可使用內置對象exception
* false:否。默認值。不可使用內置對象exceptioncss
2. include : 頁面包含的。導入頁面的資源文件
* <%@include file="top.jsp"%>
3. taglib : 導入資源
* <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
* prefix:前綴,自定義的
2. 註釋:
1. html註釋:
<!-- -->:只能註釋html代碼片斷
2. jsp註釋:推薦使用
<%-- --%>:能夠註釋全部html
3. 內置對象
* 在jsp頁面中不須要建立,直接使用的對象
* 一共有9個:
變量名 真實類型 做用
* pageContext PageContext 當前頁面共享數據,還能夠獲取其餘八個內置對象
* request HttpServletRequest 一次請求訪問的多個資源(轉發)
* session HttpSession 一次會話的多個請求間
* application ServletContext 全部用戶間共享數據
* response HttpServletResponse 響應對象
* page Object 當前頁面(Servlet)的對象 this
* out JspWriter 輸出對象,數據輸出到頁面上
* config ServletConfig Servlet的配置對象
* exception Throwable 異常對象java
1. jsp演變歷史
1. 早期只有servlet,只能使用response輸出標籤數據,很是麻煩
2. 後來又jsp,簡化了Servlet的開發,若是過分使用jsp,在jsp中即寫大量的java代碼,有寫html表,形成難於維護,難於分工協做
3. 再後來,java的web開發,借鑑mvc開發模式,使得程序的設計更加合理性jquery
2. MVC:
1. M:Model,模型。JavaBean
* 完成具體的業務操做,如:查詢數據庫,封裝對象
2. V:View,視圖。JSP
* 展現數據
3. C:Controller,控制器。Servlet
* 獲取用戶的輸入
* 調用模型
* 將數據交給視圖進行展現web
* 優缺點:
1. 優勢:
1. 耦合性低,方便維護,能夠利於分工協做
2. 重用性高spring
2. 缺點:
1. 使得項目架構變得複雜,對開發人員要求高sql
1. 概念:Expression Language 表達式語言
2. 做用:替換和簡化jsp頁面中java代碼的編寫
3. 語法:${表達式}
4. 注意:
* jsp默認支持el表達式的。若是要忽略el表達式
1. 設置jsp中page指令中:isELIgnored="true" 忽略當前jsp頁面中全部的el表達式
2. \${表達式} :忽略當前這個el表達式數據庫
5. 使用:
1. 運算:
* 運算符:
1. 算數運算符: + - * /(div) %(mod)
2. 比較運算符: > < >= <= == !=
3. 邏輯運算符: &&(and) ||(or) !(not)
4. 空運算符: empty
* 功能:用於判斷字符串、集合、數組對象是否爲null或者長度是否爲0
* ${empty list}:判斷字符串、集合、數組對象是否爲null或者長度爲0
* ${not empty str}:表示判斷字符串、集合、數組對象是否不爲null 而且 長度>0
2. 獲取值
1. el表達式只能從域對象中獲取值
2. 語法:
1. ${域名稱.鍵名}:從指定域中獲取指定鍵的值
* 域名稱:
1. pageScope --> pageContext
2. requestScope --> request
3. sessionScope --> session
4. applicationScope --> application(ServletContext)
* 舉例:在request域中存儲了name=張三
* 獲取:${requestScope.name}bootstrap
2. ${鍵名}:表示依次從最小的域中查找是否有該鍵對應的值,直到找到爲止。數組
3. 獲取對象、List集合、Map集合的值
1. 對象:${域名稱.鍵名.屬性名}
* 本質上會去調用對象的getter方法
2. List集合:${域名稱.鍵名[索引]}
3. Map集合:
* ${域名稱.鍵名.key名稱}
* ${域名稱.鍵名["key名稱"]}
3. 隱式對象:
* el表達式中有11個隱式對象
* pageContext:
* 獲取jsp其餘八個內置對象
* ${pageContext.request.contextPath}:動態獲取虛擬目錄
1. 概念:JavaServer Pages Tag Library JSP標準標籤庫
* 是由Apache組織提供的開源的免費的jsp標籤 <標籤>
2. 做用:用於簡化和替換jsp頁面上的java代碼
3. 使用步驟:
1. 導入jstl相關jar包
2. 引入標籤庫:taglib指令: <%@ taglib %>
3. 使用標籤
4. 經常使用的JSTL標籤
1. if:至關於java代碼的if語句
1. 屬性:
* test 必須屬性,接受boolean表達式
* 若是表達式爲true,則顯示if標籤體內容,若是爲false,則不顯示標籤體內容
* 通常狀況下,test屬性值會結合el表達式一塊兒使用
2. 注意:
* c:if標籤沒有else狀況,想要else狀況,則能夠在定義一個c:if標籤
2. choose:至關於java代碼的switch語句
1. 使用choose標籤聲明 至關於switch聲明
2. 使用when標籤作判斷 至關於case
3. 使用otherwise標籤作其餘狀況的聲明 至關於default
3. foreach:至關於java代碼的for語句
5. 練習:
* 需求:在request域中有一個存有User對象的List集合。須要使用jstl+el將list集合數據展現到jsp頁面的表格table中
1. 界面層(表示層):用戶看的得界面。用戶能夠經過界面上的組件和服務器進行交互
2. 業務邏輯層:處理業務邏輯的。
3. 數據訪問層:操做數據存儲文件。
1. 需求:用戶信息的增刪改查操做
2. 設計:
1. 技術選型:Servlet+JSP+MySQL+JDBCTempleat+Duird+BeanUtilS+tomcat
2. 數據庫設計:
create database day17; -- 建立數據庫
use day17; -- 使用數據庫
create table user( -- 建立表
id int primary key auto_increment,
name varchar(20) not null,
gender varchar(5),
age int,
address varchar(32),
qq varchar(20),
email varchar(50)
);
3. 開發:
1. 環境搭建
1. 建立數據庫環境
2. 建立項目,導入須要的jar包
2. 編碼
4. 測試
5. 部署運維
代碼實現:
UserDao.java
package cn.itcast.dao;
import cn.itcast.domain.User;
import java.util.List;
/**
* 用戶操做的DAO
*/
public interface UserDao {
public List<User> findAll();
}
UserDaoImpl.java
package cn.itcast.dao.impl;
import cn.itcast.dao.UserDao;
import cn.itcast.domain.User;
import cn.itcast.util.JDBCUtils;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.List;
public class UserDaoImpl implements UserDao {
private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
@Override
public List<User> findAll() {
//使用JDBC操做數據庫...
//1.定義sql
String sql = "select * from user";
List<User> users = template.query(sql, new BeanPropertyRowMapper<User>(User.class));
return users;
}
}
User.java
package cn.itcast.domain;
public class User {
private int id;
private String name;
private String gender;
private int age;
private String address;
private String qq;
private String email;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getQq() {
return qq;
}
public void setQq(String qq) {
this.qq = qq;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", gender='" + gender + '\'' +
", age=" + age +
", address='" + address + '\'' +
", qq='" + qq + '\'' +
", email='" + email + '\'' +
'}';
}
}
UserService.java
package cn.itcast.service;
import cn.itcast.domain.User;
import java.util.List;
/**
* 用戶管理的業務接口
*/
public interface UserService {
/**
* 查詢全部用戶信息
* @return
*/
public List<User> findAll();
}
UserServiceImpl.java
package cn.itcast.service.impl;
import cn.itcast.dao.UserDao;
import cn.itcast.dao.impl.UserDaoImpl;
import cn.itcast.domain.User;
import cn.itcast.service.UserService;
import java.util.List;
public class UserServiceImpl implements UserService {
private UserDao dao = new UserDaoImpl();
@Override
public List<User> findAll() {
//調用Dao完成查詢
return dao.findAll();
}
}
JDBCUtils.java
package cn.itcast.util;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
/**
* JDBC工具類 使用Durid鏈接池
*/
public class JDBCUtils {
private static DataSource ds ;
static {
try {
//1.加載配置文件
Properties pro = new Properties();
//使用ClassLoader加載配置文件,獲取字節輸入流
InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
//2.初始化鏈接池對象
ds = DruidDataSourceFactory.createDataSource(pro);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 獲取鏈接池對象
*/
public static DataSource getDataSource(){
return ds;
}
/**
* 獲取鏈接Connection對象
*/
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
}
UserListServlet.java
package cn.itcast.web.servlet;
import cn.itcast.domain.User;
import cn.itcast.service.UserService;
import cn.itcast.service.impl.UserServiceImpl;
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.util.List;
@WebServlet("/userListServlet")
public class UserListServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.調用UserService完成查詢
UserService service = new UserServiceImpl();
List<User> users = service.findAll();
//2.將list存入request域
request.setAttribute("users",users);
//3.轉發到list.jsp
request.getRequestDispatcher("/list.jsp").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
list.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<!-- 網頁使用的語言 -->
<html lang="zh-CN">
<head>
<!-- 指定字符集 -->
<meta charset="utf-8">
<!-- 使用Edge最新的瀏覽器的渲染方式 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!-- viewport視口:網頁能夠根據設置的寬度自動進行適配,在瀏覽器的內部虛擬一個容器,容器的寬度與設備的寬度相同。
width: 默認寬度與設備的寬度相同
initial-scale: 初始的縮放比,爲1:1 -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- 上述3個meta標籤*必須*放在最前面,任何其餘內容都*必須*跟隨其後! -->
<title>用戶信息管理系統</title>
<!-- 1. 導入CSS的全局樣式 -->
<link href="css/bootstrap.min.css" rel="stylesheet">
<!-- 2. jQuery導入,建議使用1.9以上的版本 -->
<script src="js/jquery-2.1.0.min.js"></script>
<!-- 3. 導入bootstrap的js文件 -->
<script src="js/bootstrap.min.js"></script>
<style type="text/css">
td, th {
text-align: center;
}
</style>
</head>
<body>
<div class="container">
<h3 style="text-align: center">用戶信息列表</h3>
<table border="1" class="table table-bordered table-hover">
<tr class="success">
<th>編號</th>
<th>姓名</th>
<th>性別</th>
<th>年齡</th>
<th>籍貫</th>
<th>QQ</th>
<th>郵箱</th>
<th>操做</th>
</tr>
<c:forEach items="${users}" var="user" varStatus="s">
<tr>
<td>${s.count}</td>
<td>${user.name}</td>
<td>${user.gender}</td>
<td>${user.age}</td>
<td>${user.address}</td>
<td>${user.qq}</td>
<td>${user.email}</td>
<td><a class="btn btn-default btn-sm" href="update.html">修改</a> <a class="btn btn-default btn-sm" href="">刪除</a></td>
</tr>
</c:forEach>
<tr> <td colspan="8" align="center"><a class="btn btn-primary" href="add.html">添加聯繫人</a></td> </tr> </table></div></body></html>