1.概念
JSP是:java Server Pages(运行在服务器端java的页面),可以理解为是一个即可以写前端代码,也可以编写java代码的页面。
2.原理
jsp extends org.apache.jasper.runtime.HttpJspBase extends HttpServlet
jsp 通过编译成了 Servlet
jsp是动态网页 html是静态网页
jsp可以通过Java代码对网页进行配置
3.JSP脚本
jsp脚本:指的是jsp中定义了java代码的方式。
<%代码%> 定义的java代码,出现的位置在service()方法中,不会输出到页面上;
<%!代码%> 定义的java代码,相当于成员变量。(基本上不这样写)
<%=代码%> 定义的java代码出现位置在service()方法中,会直接输出到页面上,定义的是java表达式。
4. JSP注释
与html注释不同地方在于html注释jsp页面内容以后依旧可以在f12注释里看到,但jsp注释后,看不到.
html注释: <!-- 代码 -->
jsp注释: <%-- 代码 --%>
5. JSP指令
5.1 Page指令
属性名为contentType 表示响应到页面上的编码。
属性名为language表示jsp页面支持的语言为java语言;
属性名为pageEncoding表示设置页面编码,如果是eclipes需要设置;
属性名为import 导包;
属性名为errorPage的时候,当页面发生异常会跳转到errorPage;
//index.jsp
errorPage="error.jsp"
<%int i = 10/0;%>
//error.jsp
<body>
服务器繁忙..................
</body>
属性名为isErrorPage,
默认情况为false,改为true的时候,
可以使用内置对象exception来获取具体的异常信息。
(使用位置在errorPage中使用)
5.2 include指令
include指令用于导入页面上的资源文件.
<%--在当前页面出现异常直接出现错误界面--%>
<%@include file="error.jsp"%>
5.3 taglib指令
<%@taglib prefix="" uri="" %>
导入资源,导入jsp中常用的标签库。
6. EL表达式
6.1 写法
${} 用来替代和简化jsp中java代码的编写,规范书写代码格式。
6.2 使用
6.2.1 支持运算符:
算术运算符:+ - * /(div) %(mod)
逻辑运算符:&& (and) ||(or)
比较运算符:> < >= <= !=
空运算符: empty 用处:用于判断对象、集合、数组、字符串是否为空。
<%= 1+2%>
${1+2}
${1/2}或${1div2}
${empty 对象|集合} //空
${not empty 对象|集合} //非空
Eg:
<%
pageContext.setAttribute("name","张阿三");
%>
${empty name}
6.2.2 el表达式取值
只能从域对象中获取值
${域名称.键值}.从域对象中根据键名来取值;
${applicationScope.aaa}相当于application作用域
${sessionScope.aaa} 相当于session作用域
${requestScope.aaa} 相当于request作用域
${pageScope.aaa} 相当于pageContext作用域
注意:如果键名一样的情况下:直接${键名} 会从最小的作用域去找,直到找到为止。
6.2.3 获取对象
${域名称.键名.属性名}
取对象时候的逻辑: 实体类中setXxx();
取的时候将getXxx()去掉get以后,将首字母改为小写。
//jsp
<%
Person person = new Person();
person.setName("张三");
person.setSex("男");
request.setAttribute("user",person);
%>
${user.name}
${requestScope.user.name}
//Person类
public class Person {
private String name;
private String sex;
public Person() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
6.2.4 获取list
${域名称.键名[索引]}
<%--list--%>
<%--<%--%>
<%-- Person person = new Person();--%>
<%-- person.setName("张三");--%>
<%-- person.setSex("男");--%>
<%-- Person person2 = new Person();--%>
<%-- person2.setName("李四");--%>
<%-- person2.setSex("男");--%>
<%-- List list = new ArrayList();--%>
<%-- list.add(person);--%>
<%-- list.add(person2);--%>
<%-- request.setAttribute("persons",list);--%>
<%--%>--%>
<%--${persons[0].name}--%>
<%--${persons[1].name}<%
Person person = new Person();
person.setName("张三");
person.setSex("男");
Person person2 = new Person();
person2.setName("李四");
person2.setSex("男");
List list = new ArrayList();
list.add(person);
list.add(person2);
request.setAttribute("persons",list);
%>
${persons[0].name}
${persons[1].name}
${user.name}
${requestScope.user.name}
6.2.5 获取 map
${map["键名"]} // 如果为数字使用该方法,平时两种都可以。
${map.键名}
<%
Person person = new Person();
person.setName("张三");
person.setSex("男");
Person person2 = new Person();
person2.setName("李四");
person2.setSex("男");
Map map = new HashMap();
map.put("1",person);
map.put("aaa",person2);
request.setAttribute("map",map);
%>
<%--数字--%>
${map["1"].name}
<%--字符串--%>
${map["aaa"]}
${map.aaa.name}
<%
Person person = new Person();
person.setName("张三");
person.setSex("男");
Person person2 = new Person();
person2.setName("李四");
person2.setSex("男");
List list = new ArrayList();
list.add(person);
list.add(person2);
request.setAttribute("list",list);
%>
<table>
<tr>
<td>
数量
</td>
<td>
姓名
</td>
<td>
性别
</td>
</tr>
<%--遍历--%>
<c:forEach items="${list}" var="person" varStatus="s">
<tr>
<td>${s.count}</td>
<td>${person.name}</td>
<td>${person.sex}</td>
<td><a href="">修改</a> |
<a href="">删除</a>
</td>
</tr>
</c:forEach>
</table>
7. JSTL表达式
7.1 写法
Java Server tag library (jsp的标准标签库) 用于简化 jsp页面开发
7.2 使用
先导包
需要导包:导入 jstl-版本号、standard-版本号
导入到lib目录下;
需要
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
常用标签
c:if
<%--当sex=男默认选择男 否则 默认选择女--%>
<%request.setAttribute("sex","男");%>
<%--c:if 相当于java代码中的if 条件写在test 返回Boolean值 注意:没有 else,如果需要另一种情况则继续加c:if--%>
<c:if test="${sex=='男'}">
<input type="radio" name="radio" value="男" checked>男
<input type="radio" name="radio" value="女" >女
</c:if>
<c:if test="${sex=='女'}">
<input type="radio" name="radio" value="男" >男
<input type="radio" name="radio" value="女" checked>女
</c:if>
c:choose
<%--
c:choose相当于我们Java代码中
switch...case
c:otherwise相当于default 不需要加条件。
--%>
<%
request.setAttribute("i",1);
%>
<c:choose>
<c:when test="${i==1}">
111111
</c:when>
<c:when test="${i==3}">
333333
</c:when>
<c:otherwise>222222</c:otherwise>
</c:choose>
c:foreach
<%--
c:foreach相当于java代码中的for循环
begin相当于初始值 如:int i=0;
end相当于结束值 如:i<=5;
step相当于递进 如:i++
var 相当于声明变量名 如 : i
--%>
<c:forEach begin="0" end="5" step="1" var="i">
${i} <%--0 1 2 3 4 5 --%>
</c:forEach>
<%--
items相当于集合;
var 相当于循环的变量i
varStatus属性相当于循环对象的状态也就是次数:通常情况下
写成varStatus="s" 用来获取数量 s.count可以取到数量。
--%>
<%
Person person = new Person();
person.setName("张三");
person.setSex("男");
Person person2 = new Person();
person2.setName("李四");
person2.setSex("男");
List list = new ArrayList();
list.add(person);
list.add(person2);
request.setAttribute("list",list);
Map map = new HashMap();
map.put("p1",person);
map.put("p2",person2);
request.setAttribute("map",map);
%>
<table>
<tr>
<td>数量</td>
<td>姓名</td>
<td>性别</td>
<td>操作</td>
</tr>
<%--遍历--%>
<c:forEach items="${list}" var="person" varStatus="s">
<tr>
<td>${s.count}</td>
<td>${person.name}</td>
<td>${person.sex}</td>
<td><a href="">修改</a> |
<a href="">删除</a>
</td>
</tr>
</c:forEach>
</table>
<table>
<tr>
<td>数量</td>
<td>姓名</td>
<td>性别</td>
<td>操作</td>
<c:forEach items="${map}" var="p" varStatus="s">
<tr>
<td>${s.count}</td>
<td>${p.value.name}</td>
<td>${p.value.sex}</td>
<td><a href="">修改</a> |
<a href="">删除</a>
</td>
</tr>
</c:forEach>
</tr>
</table>