JSP
1.1、什么是JSP
Java Server Pages:Java服务器端页面,也和Servlet一样,用于动态Web技术。
最大的特定:
-
写JSP就像在写HTML
-
区别:
-
HTML只给用户提供静态的数据
-
JSP页面中可以嵌入Java代码,为用户提供动态数据;
-
1.2、JSP原理
思路:JSP怎么执行?
-
代码层面没有任何问题
-
服务器内部工作
tomcat中有一个work目录;
IDEA中使用Tomcat会在IDEA的tomcat中生成一个work目录
C:\Users\95735\AppData\Local\JetBrains\IntelliJIdea2021.3\tomcat
jsp
C:\Users\95735\AppData\Local\JetBrains\IntelliJIdea2021.3\tomcat\45a80b88-3ff4-463b-b345-fd5572b76156\work\Catalina\localhost\ROOT\org\apache\jsp
浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet!
JSP最终也会被转换成为一个Java类!
JSP本质就是一个Servlet
//初始化 public void _jspInit() { } //销毁 public void _jspDestroy() { } //JSPService public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
-
判断请求
-
内置一些对象
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 //响应
-
输出页面前增加的代码
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;
-
以上的这些个对象我们可以在JSP页面中直接使用!
在JSP页面中:
只要是Java代码就会原封不动的输出;
如果是HTML代码,就会被转换为
out.write("<html>\r\n");
这样的格式,输出到前端!
1.3、JSP基础语法
任何语言都有自己的语法,Java中有,JSP作为Java技术的一种应用,它拥有一些自己扩充的语法(了解,知道),Java所有语法都支持!
JSP表达式
<%-- JSP表达式 作用:用来将程序的输出,输出到客户端 <%= 变量或者表达式%> --%> <%= new java.util.Date()%>
jsp脚本片段
<%-- jsp脚本片段 --%> <% int sum = 0; for (int i = 1; i <= 100; i++) { sum += i; } out.println("<h1>Sum="+sum+"</h1>"); %>
脚本片段的再实现
<% int x = 10; out.println(x); %> <p>这是一个JSP文档</p> <% int y = 2; out.println(y); %> <hr> <%-- 在代码中嵌入HTML元素 --%> <% for (int i = 0; i < 5; i++) { %> <h1>Hello,World <%=i %> </h1> <% } %>
JSP声明
<%! static { System.out.println("Loading Servlet!"); } private int globalVar = 0; public void print(){ System.out.println("进入了方法!"); } %>
JSP声明:会被编译到JSP生成的Java的类中!其他的,就会被生成到_jspService方法中!
在JSP中,嵌入Java代码即可!
1 <%%> //片段 2 <%=%> //表达式输出值 3 <%!%> //定义全局 4 5 <%--注释--%>
JSP的注释,不会在客户端显示,HTML会!
1.4、JSP指令
<%@page args....%> <%@ include file=""%> <%-- JSP标签 jsp:include:拼接页面,本质还是三个 --%> <jsp:include page="/common/header.jsp"/> <h1>网页主体</h1> <% int i = 10; %> <jsp:include page="/common/footer.jsp"/>
1.5、9大内置对象
-
PageContext 存东西
-
Request 存东西
-
Response
-
Session 存东西
-
Application [ServletContext] 存东西
-
Config [ServletConfig]
-
out
-
page ,不用了解
-
exception
pageContext.setAttribute("name1","小明1");//保存的数据只在一个页面中有效 request.setAttribute("name2","小明2");//保存的数据只在一次请求中有效,请求转发会携带这个数据 session.setAttribute("name3","小明3");//保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器 application.setAttribute("name4","小明4");//保存的数据只在服务器中有效,从打开服务器到关闭服务器 request:客户端向服务器发送请求,产生的数据,用户看完就没用了,比如:新闻用户看完没用的! session:客户端向服务器发送请求,产生的数据,用户用完一会还有用,比如:购物车; application:客户端向服务器发送请求,产生的数据,一个用户用完了,其他用户可能还要使用,比如:聊天数据; 后端请求转发 //request.getRequestDispatcher("/index.jsp").forward(request,response); 前端请求转发 pageContext.forward("/index.jsp");
1.6、JSP标签、JSTL标签、EL表达式
<!-- 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>
EL表达式:${}
-
获取数据
-
执行运算
-
获取web开发的常用对象
-
调用Java方法
JSP标签
<%--<jsp:include --%> <%-- http://localhost:8080/jsptag.jsp?name=value1&age=value2 --%> <jsp:forward page="/jsptag2.jsp"> <jsp:param name="name" value="value1"/> <jsp:param name="age" value="value2"/> </jsp:forward>
JSTL表达式
JSTL标签库的使用就是为了弥补HTML标签的不足,它自定义许多标签,可以供我们使用,标签的功能和Java代码一样!
核心标签(需要掌握)
格式化标签
SQL标签
XML标签
JSTL标签库使用步骤
-
引入对应的taglib
-
使用其中的方法
-
在tomcat也需要引入jstl的jar包,否则会报错:JSTL解析错误
c:if
<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> <%--判断如果提交的是用户管理员,则登录成功--%> <c:if test="${param.username == 'admin'}" var="isAdmin" > <c:out value="管理员欢迎你!" /> </c:if> <%--自闭合标签--%> <c:out value="${isAdmin}"/>
c:when
<%--定义一个变量score,值为85--%> <c:set var="score" value="85"/> <c:choose> <c:when test="${score>=60}"> 你的成绩为及格 </c:when> <c:when test="${score>=70}"> 你的成绩为一般 </c:when> <c:when test="${score>=80}"> 你的成绩为良好 </c:when> <c:when test="${score>=90}"> 你的成绩为优秀 </c:when> <c:when test="${score<=60}"> 你的成绩为优秀 </c:when> </c:choose>
c:foreach
<% ArrayList<String> people = new ArrayList<>(); people.add(0,"jikf"); 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> <c:forEach var="people" items="${list}" begin="1" end="3" step="2"> <c:out value="${people}"/> <br> </c:forEach>
实体类
JavaBean有特定的写法:
-
必须有一个无参构造
-
属性必须私有化
-
必须有对应的get/set方法
一般用来和数据库的字段做映射 ORM;
ORM:对象关系映射
-
表--->类
-
字段-->类的属性
-
行记录--->对象
people表
id | name | age | address |
---|---|---|---|
1 | su1 | 3 | cq |
2 | su2 | 20 | cq |
3 | su3 | 50 | cq |
class People{ private int id; private String name; private String address; private int age; } class A{ new People(1,"su1",3,"cq"); }