Java Servler pages: java服务器端页面,和servlet一样,用于动态web技术。
最大的特点:
jsp是怎么执行的?
服务器的内部工作:
浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet。
html页面的内存在底层是用java代码去渲染的。
jsp本质上就是java中:
response.setContentType("text/html;charset=UTF-8");
<%%>会直接就是java代码。
<%= %>会print到页面上。
客户端向服务器请求jsp资源,服务器会在work工作目录中生成jsp对应的java文件,将jsp页面转化为java页面,再编译成class文件,返回给客户端。
<dependencies>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>servlet-apiartifactId>
<version>2.5version>
dependency>
<dependency>
<groupId>javax.servlet.jspgroupId>
<artifactId>jsp-apiartifactId>
<version>2.0version>
dependency>
<dependency>
<groupId>javax.servlet.jsp.jstlgroupId>
<artifactId>jstl-apiartifactId>
<version>1.2version>
dependency>
<dependency>
<groupId>taglibsgroupId>
<artifactId>standardartifactId>
<version>1.1.2version>
dependency>
dependencies>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<hr>
<%--1.JSP表达式
作用:用来将程序的输出,输出到客户端
<%= 变量或表达式%>
--%>
<%= new java.util.Date()%>
<%--2.jsp脚本片段--%>
<%
int sum = 0;
for (int i = 0; i < 100; i++) {
sum += i;
}
out.print("Sum="
+sum+"");
%>
<%--上一个代码片段中定义的变量,下面的代码片段仍然可以使用。--%>
<%
int x=10;
out.println(x);
%>
<p>这是一个jsp文档</p>
<% out.println(x); %>
<hr>
<%--3.在代码嵌入html元素--%>
<%
for (int i=0;i<5;i++){
%>
<h1>在代码嵌入html元素<%=i%></h1>
<% }%>
<hr>
<%--4.还可以写一些全局变量或者方法外部的其他方法。(JSP声明)--%>
<%!
static {
System.out.println("导入Servlet");
}
private int globalVar = 0;
public void kuang(){
System.out.println("进入了方法kuang");
}
%>
<!--5. HTML的注释-->
<%--JSP的注释--%>
</body>
</html>
查看网页源代码后发现,html的注释依旧可以被查看,但jsp的注释没有了。
这样就可以把一些重要的信息放入jsp的注释中。安全性就高了。
1.<%@ page errorPage=“error/500.jsp” %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--定制错误页面--%>
<%--<%@ page errorPage="error/500.jsp" %>--%>
<%--导包--%>
<%@ page import="java.util.Date" %>
<html>
<head>
<title>jsp2</title>
</head>
<body>
<%
int x=1/0;
%>
<%=new Date()%>
</body>
</html>
@include: 会将两个页面 合二为一
jsp:include: 拼接页面,本质还是三个。
比如点击头部的标签,下面的页面发送变化,但上面的头部信息都没有发生改变。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--@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"/>
</body>
</html>
公共的页面一般会取一个文件夹,如common。
这两个页面不是完整的,但是可以嵌入到别的页面。
使用jsp:include更加的灵活。
pageContext.setAttribute("name1", "张三1号");
request.setAttribute("name2", "张三2号");
session.setAttribute("name3", "张三3号");
application.setAttribute("name4", "张三4号");
pageContext的几个对象就对应下面几个对象,这些对象之间可以相互转换。
作用域从小到大:page->request->session->application
<%@ 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号");
%>
<%--
脚本片段中的代码,会被原封不动的生成到jsp.java中
要求:这里面的代码,必须保证java语法的正确性。
--%>
<%--从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");//不存在
String name6 = (String) pageContext.getAttribute("name6");//不存在
%>
<%--使用el表达式输出 ${}--%>
<h1>取出的值为:</h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<h3>${name5}</h3>
<h3>${name6}</h3>
</body>
</html>
这种是网站中不希望看到的,所以一般取值都用el表达式。
5和6没有拿到,因为5和6本来就不存在。
在另一个页面中去取:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>02</title>
</head>
<body>
<%
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");//不存在
String name6 = (String) pageContext.getAttribute("name6");//不存在
%>
<%--使用el表达式输出 ${}--%>
<h1>取出的值为:</h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<h3>${name5}</h3>
<h3>${name6}</h3>
<h3><%=name5%></h3>
</body>
</html>
每个用户在各自的session中存的东西在这三个请求中随便拿。
如果3个用户都要取东西,由于session是为一个用户服务的,放在session里面肯定不行。
统计在线人数也需要在最外层application去拿。
使用jsp跳转到一个新的页面
使用jsp标签进行转发:
<jsp:forward page="jsptag2.jsp"></jsp:forward>
转发的同时还可以设置参数:
<jsp:forward page="jsptag2.jsp">
<jsp:param name="name" value="zhangsan"/>
<jsp:param name="age" value="13"/>
</jsp:forward>
获取参数:
<%--取出参数--%>
姓名:<%=request.getParameter("name")%>
年龄:<%=request.getParameter("age")%>
EL表达式:${}
JSTL标签库的使用就是为了弥补HTML标签的不足;它有很多自定义标签,功能和java代码一样。
jstl标签能做到的事情java也可以做出来,jstl标签只是为了让代码变得更整齐。
核心标签库:<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %> ,c就是core
格式化标签库:<%@ taglib prefix=“fmt”
uri=“http://java.sun.com/jsp/jstl/fmt” %>
SQL标签库:<%@ taglib prefix=“sql”
uri=“http://java.sun.com/jsp/jstl/sql” %>
XML标签库: <%@ taglib prefix=“x”
uri=“http://java.sun.com/jsp/jstl/xml” %>,x就是xml
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--引入jstl标签库,并在idea及tomcat中导入对应的jar包,才能使用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>
<%--如果提交的用户是管理员,则登录成功--%>
<%--使用jsp标签:--%>
<%--<%--%>
<%-- if (request.getParameter("username").equals("admin")){--%>
<%-- out.print("登录成功");--%>
<%-- }--%>
<%--%>--%>
<%--使用jstl标签:--%>
<c:if test="${param.username.equals('admin')}" var="isAdmin">
<c:out value="登录成功"/>
</c:if>
<c:out value="${isAdmin}"/>
</body>
</html>
<%@ 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>=60}">
你的成绩为一般
</c:when>
<c:when test="${score<60}">
你还需要努力
</c:when>
</c:choose>
</body>
</html>
判断的时候,先写的就优先级高。
使用for-each遍历
<%
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:要遍历的对象
%>
<%--
//类似于for(People p:list){}
--%>
<c:forEach var="p" items="${list}">
<c:out value="${p}"/>
</c:forEach>
<%--
//类似于for(int i=0;i<=n;i++){}
--%>
<c:forEach var="p" items="${list}" begin="0" end="2" step="2">
<c:out value="${p}"/>
</c:forEach>
不然会运行失败:
在tomcat中如果没有jstl相关的包,就需要手动导入,因为运行是依赖于tomcat服务器的。所以把jstl和standard的包也弄进tomcat中。
WEB-INF里面也不建议去放东西。从客户端无法直接访问WEB-INF文件夹下面的所有东西。
因为WEB-INF文件夹下面的东西对用户不可见。一般一些机密或者重要的文件才放到该文件夹下面。
正常的main中就这两个文件夹。不要再建其他文件夹了。
Resource中的文件是给java去读的。
整个web里面的资源都放在web文件夹里面。
启动类加载器就是根加载器。
如果在根的加载包中没有找到,就会去ext文件夹下去找。
这个过程就叫双亲委派。
即一直向上委托父加载器,直至根加载器。