1. 程式人生 > 其它 >JSP&JavaBean&MVC

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標籤庫使用步驟

  1. 引入對應的taglib
  2. 使用其中的方法

如果遇到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層查詢使用者名稱和密碼是否正確-->資料庫