JSP&JavaBean&MVC
一、JSP
1、什麼是JSP
Java server pages (java伺服器端頁面),和Servlet一樣,用來開發動態Web技術
最大的特點:
- 寫JSP就像在寫HTML
- 區別:
- HTML只給使用者提供靜態的資料
- JSP頁面中可以嵌入Java程式碼,為使用者提供動態資料
2、JSP原理
思路:JSP到底如何執行的
-
程式碼層面沒有任何問題
-
伺服器內部工作
-
Tomcat中有一個work目錄
-
IDEA中使用Tomcat的會在IDEA的Tomcat中生成一個work目錄
-
本機中的地址
C:\Users\LENOVO\.IntelliJIdea2017.3\system\tomcat\Unnamed_javaweb-seesion-cookie\work\Catalina\localhost\ROOT\org\apache\jsp
發現頁面轉變成了java程式!
瀏覽器向伺服器傳送請求,不管訪問什麼資源,其實都是在訪問 Servlet
JSP最終也會被轉換成一個類!
JSP本質上就是一個Servlet
//初始化
public void _jspInit() {
}
//銷燬
public void _jspDestroy() {
}
//JSPService
public void _jspService(HttpServletRequest request, HttpServletResponse response)
1、判斷請求
2、內建一些物件
final javax.servlet.jsp.PageContext pageContext; //頁面上下文 javax.servlet.http.HttpSession session = null; //session final javax.servlet.ServletContext application; //applicationContext final javax.servlet.ServletConfig config; //config javax.servlet.jsp.JspWriter out = null; //out final java.lang.Object page = this; //page:當前頁 HttpServletRequest request //請求 HttpServletResponse response //響應
3、輸出頁面前增加的程式碼
response.setContentType("text/html"); //設定響應的頁面型別 pageContext = _jspxFactory.getPageContext(this, request, response,null, true, 8192, true); _jspx_page_context = pageContext; application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); out = pageContext.getOut(); _jspx_out = out;
4、以上的這些物件我們可以在JSP頁面中直接使用
在JSP頁面中,只要是Java程式碼,就會原封不動的輸出,若是HTML程式碼,就會轉換成為out.write("<html>\r\n");這樣的樣式,輸出到前端!
3、JSP基礎語法
任何語言都有自己的語法,Java中有,JSP作為java技術的一種應用,它擁有一些自己擴充的語法(瞭解即可)
JSP支援java所有語法!
(1)JSP表示式
<%--JSP表示式:
作用:用來將程式的輸出,輸出到客戶端
<%= 變數或者表示式%>
--%>
<%=new java.util.Date()%>
(2)SP指令碼片段
<%--JSP指令碼片段:
<% java程式碼 %>
--%>
<%
int sum=0;
for (int i = 1; i <=100 ; i++) {
sum+=i;
}
out.println("<h1>Sum="+sum+"</h1>");
%>
(3)指令碼片段的再實現
<%
int x=10;
out.println(x);
%>
<p>this is JSP doc</p>
<%
int y = 2;
out.println(y);
%>
<hr>
<%--JSP中嵌入HTML程式碼--%>
<%
for (int i = 1; i <=5; i++) { //輸入五個helloworld
%>
<h1>Hello World <%= i%> </h1>
<%
}
%>
(4)JSP宣告
<%!
static {
System.out.println("Loding Servlet");
}
private int globalVar = 0;
public void method(){
int i = 0;
System.out.println("進入了方法method!");
}
%>
-
JSP宣告:會被編譯到JSP生成的Java類的類中!其他的就會被生成到jspService方法中!
-
在JSP中,嵌入Java程式碼即可!
<%%>
<%=%>
<%!%>
<%--註釋--%>
- JSP的註釋,不會在客戶端顯示,HTML就會
4、JSP指令
<%@ page arg... %>
<%@include file=""%>
<%--@include會將兩個頁面合二為一--%>
<%@include file="common/header.jsp" %>
<h1>網頁主體</h1>
<%@include file="common/footer.jsp" %>
<hr>
<%--JSP標籤--%>
<%--jsp:include會拼接頁面,本質還是三個--%>
<jsp:include page="/common/header.jsp"/>
<h1>網頁主體</h1>
<jsp:include page="/common/footer.jsp"/>
5、九大內建物件
- PageContext 存東西
- Request 存東西
- Response
- Session 存東西
- Application 【ServletContext】 存東西
- config 【ServletConfig】
- out
- page
- excepetion
在同一個頁面取:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--內建物件--%>
<%
pageContext.setAttribute("name1","1號"); //儲存的資料只在一個頁面中有效
request.setAttribute("name2","2號"); //儲存的資料只在一次請求中有效,請求轉發會攜帶這個資料
session.setAttribute("name3","3號"); //儲存的資料只在一次會話中有效,從開啟瀏覽器到關閉瀏覽器
application.setAttribute("name4","4號"); //儲存的資料只在伺服器中有效,從開啟伺服器到關閉伺服器
%>
<%
//從pageContext中取出,我們通過尋找的方式來
//從底層到高層找(作用域)
String name1 = (String) pageContext.findAttribute("name1");
String name2 = (String) pageContext.findAttribute("name2");
String name3 = (String) pageContext.findAttribute("name3");
String name4 = (String) pageContext.findAttribute("name4");
String name5 = (String) pageContext.findAttribute("name5"); //不存在
%>
<%--使用EL表示式輸出--%>
<h1>取出的值為:</h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<h3>${name5}</h3> <%--用EL表示式不存在的不會輸出到客戶端--%>
<h3><%=name5%></h3> <%--用JSP表示式的話不存在會輸出到客戶端為null--%>
</body>
</html>
在不同的頁面中取:
總結:
request:客戶端向伺服器傳送請求,產生的資料,使用者看完就沒用,比如:新聞,使用者看完沒用的;
session:客戶端下個伺服器傳送請求,產生的資料,使用者用完一會還有用,比如:購物車;
application:客戶端向伺服器傳送請求,產生的資料,一個使用者用完了,其他使用者還可能使用,比如:聊天資料;
6、JSP標籤、JSTL標籤、EL表示式
需要在pom.xml中導包
<!--JSTL表示式的依賴-->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<!--Standard標籤庫-->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
1、EL表示式:${ }
- 獲取資料
- 執行運算
- 獲取web開發的常用物件
2、JSP標籤
japtag.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--<jsp:include --%>
<%--下面的結果回這樣子顯示:http://localhost:8080/jsptag.jsp?name=jhoves&age=12--%>
<jsp:forward page="/jsptag2.jsp">
<jsp:param name="name" value="jhoves"></jsp:param>
<jsp:param name="age" value="12"></jsp:param>
</jsp:forward>
<h1>1</h1>
</body>
</html>
japtag2.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>2</h1>
<%--取出引數--%>
名字:<%=request.getParameter("name")%>
年齡:<%=request.getParameter("age")%>
</body>
</html>
執行結果:
3、JSTL表示式
JSTL標籤庫的使用就說為了彌補HTML標籤的不足;它自定義許多標籤,可以供完美使用,標籤的功能和java程式碼一樣!
引入JSTL核心標籤庫(掌握即可)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--引入JSTL核心標籤庫,我們才能使用JSTL標籤--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>引入JSTL核心標籤庫</h1>
</body>
</html>
JSTL標籤庫使用步驟:
- 引入對應的taglib
- 使用其中的方法
如果遇到500錯誤,需要在Tomcat中引入jstl的jar包,否則會報錯:JSTL解析錯誤
c:if:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--引入JSTL核心標籤庫,我們才能使用JSTL標籤--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h4>if測試</h4>
<hr>
<form action="coreif.jsp" method="get">
<%--
EL表示式獲取表單中的資料
${param.引數名}
--%>
<input type="text" name="username" value="${param.username}">
<input type="submit" value="登入">
</form>
<%--判斷如果提交的使用者是管理員,則登入成功--%>
<%--java寫法:
<%
if(request.getParameter("username").equals("admin")){
out.print("登入成功");
}
%>
--%>
<c:if test="${param.username =='admin'}" var="isAdmin">
<c:out value="管理員歡迎您"/>
</c:if>
<c:out value="${isAdmin}"/>
</body>
</html>
c:choosw和c:when:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--定義一個變數score, 值為85--%>
<c:set var="score" value="85"/>
<c:choose>
<c:when test="${score>=90}">
優秀
</c:when>
<c:when test="${score>=80}">
良好
</c:when>
<c:when test="${score>=70}">
一般
</c:when>
<c:when test="${score>=60}">
不及格
</c:when>
</c:choose>
</body>
</html>
c:foreach:
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
ArrayList<String> people = new ArrayList<>();
people.add(0,"張三");
people.add(1,"李四");
people.add(2,"王五");
people.add(3,"趙六");
people.add(4,"田七");
request.setAttribute("list",people);
%>
<%--
var:每一次遍歷出來的變數
items:要遍歷的物件
begin:從哪開始
end:到哪結束
step:步長
--%>
<c:forEach var="people" items="${list}">
<c:out value="${people}"/> <br>
</c:forEach>
<hr>
<%--相當於Java的for迴圈--%>
<c:forEach begin="1" end="3" step="2" var="people" items="${list}">
<c:out value="${people}"/> <br>
</c:forEach>
</body>
</html>
二、JavaBean
實體類
JavaBean有特定的寫法:
- 必須有一個無參構造
- 屬性必須私有化
- 必須有對應的get/set方法
一般用來和資料庫的欄位做對映ORM;
ORM:物件關係對映
- 表--->類
- 欄位--->屬性
- 行記錄--->物件
People表
id | name | age | address |
---|---|---|---|
1 | 一號 | 30 | 木星 |
2 | 二號 | 18 | 金星 |
3 | 三號 | 42 | 水星 |
class People{
private int id;
private String name;
private int age;
private String address;
}
class A{
new People(1,"一號",30,"木星");
new People(2,"二號",18,"金星");
new People(3,"三號",42,"水星");
}
javabean.jsp:
<%@ page import="com.jhoves.pojo.People" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
// People people = new People();
// people.setAddress();
// people.setId();
// people.setAge();
// people.setName();
%>
<jsp:useBean id="people" class="com.jhoves.pojo.People" scope="page"/>
<jsp:setProperty name="people" property="address" value="太空"/>
<jsp:setProperty name="people" property="id" value="1"/>
<jsp:setProperty name="people" property="age" value="3"/>
<jsp:setProperty name="people" property="name" value="五虎"/>
姓名:<jsp:getProperty name="people" property="name"/>
id:<jsp:getProperty name="people" property="id "/>
年齡:<jsp:getProperty name="people" property="age"/>
地址:<jsp:getProperty name="people" property="address"/>
</body>
</html>
三、MVC三層架構
什麼的MVC:MOdel view Controller 模型、檢視、控制器
1、以前
使用者直接訪問控制層,控制層就可以直接操作資料庫;
servlet-->CRUD-->資料庫
弊端:程式十分臃腫,不利於維護
Servlet的程式碼中:處理請求、響應、檢視跳轉、處理JDBC、處理業務程式碼、處理邏輯程式碼
架構:沒有什麼是加一層解決不了的!
2、MVC三層架構
Model
- 業務處理:業務邏輯(Service)
- 資料持久層:CRUD(Dao)
View
- 展示資料
- 提供連結發起Servlet請求(a,form,img...標籤)
Controller(Servler)
- 接收使用者的請求:(req:請求引數,Session資訊..)
- 交給業務層處理對應的程式碼
- 控制檢視的跳轉
登入-->接收使用者的登入請求-->處理使用者的請求(獲取使用者登入的引數,username,password)-->交給業務層處理登入業務(判斷使用者名稱密碼是否正確:事務)-->Dao層查詢使用者名稱和密碼是否正確-->資料庫