什么是JSP:
JSP全名为Java Server Page 是为了简化servlet的工作而出现的替代品。
在JSP中java代码与HTML共同存在,其中HTML代码用于展示静态的内容,java代码用来展示动态的内容。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>home</title>
</head>
<body>
<h2>我是网站的首页,欢迎访问</h2>
</body>
</html>
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "HTMLServlet",urlPatterns = "/html")
public class HTMLServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=utf-8");
PrintWriter writer = response.getWriter();
writer.write("<!DOCTYPE html>");
writer.write("<html lang=\"en\">");
writer.write("<head>");
writer.write("<meta charset=\"UTF-8\">");
writer.write("<title>home</title>");
writer.write("</head>");
writer.write("<body>");
writer.write("<h2>网站首页</h2>");
writer.write("</body>");
writer.write("</html>");
}
}
jsp在第一次被访问时会被Web容器翻译成servlet,jsp本质上就是Servlet。
过程:
第一次访问----->helloServlet.jsp------>helloServlet_jsp.java------->编译运行
被翻译后的servlet在Tomcat的work目录中可以找到,使用IDEA会单独为项目维护一个目录。
通过观察发现jsp会转化为java文件,并且间接的继承了HttpServlet,实现了其中的主要方法,init、service、destory,并且将html代码通过java方式输出给浏览器。
JSP脚本:
- <%java代码%>
- <%=java变量或表达式%>
- <%!java代码%>
JSP注释:
- Html注释:
<!--注释内容-->
- java注释:
//单行注释 /*多行注释*/
- jsp注释:<%--注释内容--%>
jsp的指令是指导jsp翻译和运行的命令,jsp包括三大指令:
taglib指令:
在jsp页面中引入标签库(jstl标签库,structs2标签库);
格式:<%@ taglb url=“标签库地址” prefix=""%>;
page指令-----属性最多的指令(实际开发中page指令默认),属性最多的一个指令,根据不同的属性,指导整个页面特性格式:<%@ page 属性名1=“属性值1” 属性名2=“属性值2”…%>
常用属性如下:
language:jsp脚本可以嵌入的语言种类;
contentType:response.setContentType(text/html.charset=UTF-8);
session:是否jsp在翻译时自动创建session;
import:导入java的包;
errorPage:当当前页面出错后跳转到哪个页面;
include指令:
页面包括(静态包含)指令,可以将一个jsp页面包含到另一个jsp页面中;
格式:<%@ include file=“被包含的文件地址”%>;
<%@include file="/include.jsp" %>
<%@taglib uri="xxx" prefix="c"%>
1.pageContext对象:
pageContext对象就是jsp页面的上下文对象。
2.pageContext是一个域对象:
3.pageContext可以向指定的其他域中存取数据:
setAttribute(String name,Object obj,int scape)
getAttribute(String name,int scape)
removeAttribute(String name,int scape)
findAttribute(String name)//获取顺序依次从pageContext域,request域,session域,application域中获取属性
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
// pageContext.setAttribute("name","xiaoming");
// pageContext.setAttribute("name","zhangsan",PageContext.REQUEST_SCOPE);
pageContext.setAttribute("name","lisi",PageContext.SESSION_SCOPE);
pageContext.setAttribute("name","wangwu",PageContext.APPLICATION_SCOPE);
%>
<%=pageContext.getAttribute("name",PageContext.REQUEST_SCOPE)%>
<%=pageContext.getAttribute("name",PageContext.APPLICATION_SCOPE)%>
<%=
pageContext.findAttribute("name")
%>
</body>
</html>
四大作用域的区别:
page域:当前jsp页面范围。
request域:一次请求。
session域:一次会话。
application域:整个web应用。
EL表达式:
EL 全名为Expression Language,它提供了在JSP中简化表达式的方法,让JSP的代码更加简化,可以嵌入在jsp页面内部,减少jsp脚本的编写
EL从域中取数据:
jsp脚本:<%=request.getAttribute(name)%>
EL表达式替代上面的脚本:${requestScope.name}
EL最主要的作用是获得四大域中的数据,格式:
${EL表达式}
EL获得pageContext域中的值:${pageScope.key}
EL获得request域中的值:${requestScope.key}
EL获得session域的值:${sessionScope.key}
EL获得application域中的值:${applicationScope.key}
pageContext可以向指定的其他域中存取数据:
setAttribute(String name,Object obj,int scape)
getAttribute(String name,int scape)
removeAttribute(String name,int scape)
findAttribute(String name)//获取顺序依次从pageContext域,request域,session域,application域中获取属性
可以获得其他8大隐式对象:
如:pageContext.getRequest()
pageContext.getSession()
EL的内置对象:
pageScope,requestScope,sessionScope,applicarionScope-------获取JSP中域中的数据
param,paramValues ----接收参数。相当于request.getParameter() request.getParameterValues()
header.headerValues -----获取请求头信息。 相当于request.getHeader(name)
initParam -----获取全局初始化参数。相当于this.getServletContext().getInitParameter(name)
cookie -----WEB开发中cookie。相当于request.getCookies()---->cookie.getName()------>cookie.getValue()
pageContext —WEB开发中的pageContext。
pageContext获取其他八大对象。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--假如http请求中传入了一个username的参数--%>
<%
request.getParameter("userName");
%>
<%--EL的内置对象--%>
${param.userName}
${header.host}
<%--获取项目路径--%>
${pageContext.request.contextPath}
<%--JSP主要用来展示数据,sevlet主要用来处理数据--%>
</body>
</html>
<%--EL表达式从区域中获取数据的方式--%>
${requestScope.name}
${sessionScope.user.name}
${applicationScope.list[0].name}
${name}
${user.name}
${list[0].name}
<%--EL执行表达式--%>
${1+1}
<%--关系运算--%>
${2>1}
${2 eq 2}
<%--逻辑运算--%>
${2>1 || 3>2}
<%--三元表达式--%>
${3>2 ? true:false}
${3>2 ? "正确":"呜呜"}
<%--判断对象是否为空--%>
${empty name}
JSTL:
JSTL,JSP标准标签库,可以嵌入在jsp页面中使用标签的形式完成业务逻辑等功能,jstl出现的目的同EL一样也是要代替jsp页面中的脚本代码,jstl标准标准标签库有5个子库,但随着发展,目前常使用的是它的核心库。
jstl的标签:
<c:if>标签专门用于完成JSP界面中的条件判断
<c:if test=“表达式”>
//表达式成立执行语句
</c:if>
其中test是返回boolean的条件
FollowServlet:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "FollowServlet",urlPatterns = "/follow")
public class FollowServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String follow=request.getParameter("follow");
request.setAttribute("follow",follow);
request.getRequestDispatcher("/jstl/jstl.jsp").forward(request,response);
}
}
jstl/jstl.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--使用JSTL的时候需要配合EL表达式--%>
<c:if test="${requestScope.follow eq 1}">
取消关注
<%--如果test等于true 则会执行内部代码,如果是false则不会执行内部代码--%>
</c:if>
<c:if test="${requestScope.follow eq 0}">
关注
<%--如果test等于true 则会执行内部代码,如果是false则不会执行内部代码--%>
</c:if>
</body>
</html>
JSTL的forEach标签:
<c:forEach>用来循环遍历集合对象中的元素,如List、Map、数组等和java代码中的for循环一样,它也有两种形式
<%@ page import="net_zixue.bean.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--<c:if test="1+1==2">
表达式成立,执行内部语句
</c:if>--%>
<%--使用JSTL的时候需要配合EL表达式--%>
<%--jstl标签不能独自执行运算--%>
<%--<c:if test="${1+1==2}">
表达式成立,执行内部语句
</c:if>--%>
<c:if test="${requestScope.follow eq 1}">
<%-- 字符串等于用eq--%>
<%-- 没有else标签--%>
取消关注
<%--如果test等于true 则会执行内部代码,如果是false则不会执行内部代码--%>
</c:if>
<c:if test="${requestScope.follow eq 0}">
关注
<%--如果test等于true 则会执行内部代码,如果是false则不会执行内部代码--%>
</c:if>
<%
List<User> list=new ArrayList<>();
User user1=new User();
user1.setName("小强");
user1.setSex("男");
User user2=new User();
user2.setName("小丽");
user2.setSex("女");
list.add(user1);
list.add(user2);
// 第一种遍历输出
for (int i = 0; i < list.size(); i++) {
System.out.println(i);
}
request.setAttribute("list",list);//把list加入到一个域对象里
for (User user : list) {
System.out.println(user.getName());
}
%>
<%--var变量的意思--%>
<c:forEach begin="0" end="${list.size()-1}" var="i">
<%-- el表达式--%>
${list[i].name}
</c:forEach>
<%--items代表的是一个集合或者是数组--%>
<%--var代表集合里面的每一个元素--%>
<c:forEach items="${list}" var="user">
${user.name}
</c:forEach>
</body>
</html>
PhoneListServlet:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@WebServlet(name = "PhoneListServlet",urlPatterns = "/phonelist")
public class PhoneListServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//通过servlet从数据库中获取数据,我们这里暂时通过手动创建数据
Phone phone=new Phone();//鼠标放在Phone上Alt+Enter快捷键建立Phone类
phone.setName("iphone6");
phone.setId(001);
phone.setImage("https://img10.360buyimg.com/n7/jfs/t277/193/1005339798/768456/29136988/542d0798N19d42ce3.jpg");
phone.setPrice("3900");
Phone phone1=new Phone();
phone1.setName("坚果pro");
phone1.setId(002);
phone1.setPrice("1799");
phone1.setImage("https://img13.360buyimg.com/n7/jfs/t5377/56/1578379545/209772/32105f74/5911bcbdN7afa707b.jpg");
Phone phone2=new Phone();
phone2.setName("vivo x9");
phone2.setPrice("2345");
phone2.setId(003);
phone2.setImage("https://img12.360buyimg.com/n7/jfs/t6067/340/2101390376/231820/750cc50e/593aa83fN8b0829fc.jpg");
Phone phone3=new Phone();
phone3.setName("oppo A57");
phone3.setId(004);
phone3.setPrice("1399");
phone3.setImage("https://img10.360buyimg.com/n7/jfs/t4978/185/135948089/78285/f6a84203/58db6fa4N354322d9.jpg");
Phone phone4=new Phone();
phone4.setName("诺基亚6");
phone4.setId(005);
phone4.setPrice("1699");
phone4.setImage("https://img11.360buyimg.com/n7/jfs/t4930/86/192598423/86027/36a57ccf/58dcbfa5N5c41cbfd.jpg");
Phone phone5=new Phone();
phone5.setName("小米MIX");
phone5.setId(006);
phone5.setPrice("3999");
phone5.setImage("https://img13.360buyimg.com/n7/jfs/t4264/215/455518113/309855/38fe41f1/58b4fc81N1d924112.jpg");
List<Phone> list=new ArrayList<>();
list.add(phone);
list.add(phone1);
list.add(phone2);
list.add(phone3);
list.add(phone4);
list.add(phone5);
request.setAttribute("list",list);
request.getRequestDispatcher("/phone_list.jsp").forward(request,response);
}
}
Phone.java:
public class Phone {
private int id;
private String name;
private String image;
private String price;
//Art+Ins快捷键加入get,set方法
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
}
phone_list.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>商品列表</title>
</head>
<body>
<c:forEach items="${list}" var="phone">
<div class="col-md-2" style="height:250px">
<img src="${phone.image}" width="170" height="170" style="display: inline-block;">
</a>
<p>
<a href="product_info.html" style='color: green'>${phone.name}</a>
</p>
<p>
<font color="#FF0000">商城价:¥${phone.price}</font>
</p>
</c:forEach>
</div>
</body>
</html>