
程序员在开发过程中,发现 servlet 做界面非常不方便


创建 hspedu_jsp WEB 项目,并引入 jar

创建 D:\idea_java_projects\hspedu_jsp\web\sum.jsp
<%-- Created by IntelliJ IDEA. User: 29942 Date: 2024/3/16 Time: 11:08 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> JSP的简单求和计算器 hsp的简单计算器
<% //在jsp文件的这个标签中,就代表识别为java程序 int i=10; int j=30; int res=i+j; out.print(i+" + "+j+" = "+res); //在jsp中,内置了对象,可以直接使用,比如out %> 




<%-- User: Linran Date: 2024/3/16 Time: 11:54 Version: 1.0 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> JSP声明脚本 jsp声明脚本
<%! //这里我们可以声明该jsp需要使用的属性,方法,静态代码块,内部类 //也就是给statement.jsp对应的statement_jsp 类定义 //1.属性 private String name="jack"; private int age; private static String company; //2 方法 public String getName(){ return name; } //静态代码块 static { company="字节跳动"; } %> <%-- User: Linran Date: 2024/3/16 Time: 15:10 Version: 1.0 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> 表达式脚本 <% String name="林然"; %> 用户名:<%=name%> package com.hspeud.entity; public class Monster { private Integer id; private String name; private String skill; public Monster(Integer id, String name, String skill) { this.id = id; this.name = name; this.skill = skill; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSkill() { return skill; } public void setSkill(String skill) { this.skill = skill; } } <%@ page import="java.util.ArrayList" %> <%@ page import="com.hspeud.entity.Monster" %><%-- User: Linran Date: 2024/3/16 Time: 15:21 Version: 1.0 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> 演示代码脚本 演示代码脚本
<% //先创建ArrayList,添加两个monster ArrayList monsters = new ArrayList<>(); monsters.add(new Monster(1,"牛魔王","芭蕉扇")); monsters.add(new Monster(2,"蜘蛛精","吐口水")); %> id 名字 技能 <% for (int i = 0; i <%=monster.getId()%> <%=monster.getName()%> <%=monster.getSkill()%> <% } %>


. pageContext (域对象,存放的数据只能在当前页面使用)

. request (域对象,存放的数据在一次 request 请求有效)
. session(域对象,存放的数据在一次会话有效),
. application(域对象,存放的数据在整个 web 应用运行期间有效, 范围更大),



使用 jsp 完成一个简单的计算器
思路

代码
<%-- User: Linran Date: 2024/3/27 Time: 13:32 Version: 1.0 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> JSP计算器 <%-- 使用js+正则表达式完成数据校验--%> JSP计算器
package com.hspeud.servlet; import com.hspeud.utils.WebUtils; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class CalServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("CalServlet被调用"); //是servlet //接收数据 String num1 = request.getParameter("num1"); String num2 = request.getParameter("num2"); //进行转换 int i = WebUtils.parseInt(num1, 0); int j = WebUtils.parseInt(num2, 0); String oper = request.getParameter("oper"); double res=0; //完成计算 if("+".equals(oper)){ res=i+j; }else if("-".equals(oper)){ res=i-j; }else if("*".equals(oper)){ res=i*j; }else if("/".equals(oper)){ res=i*1.0/j; }else { System.out.println("oper不正确"); } //保存到域对象[request session servletContext //因为一个请求一次计算,所以建议将结果保存到页面中 //把结果组织到一个字符串中,方面在下一个页面显示 String formatRes = String.format("%s %s %s = %s", num1, oper, num2, res); request.setAttribute("res",formatRes); // request.setAttribute("num1",num1); // request.setAttribute("num2",num2); // request.setAttribute("res",res); // System.out.println("formatRes: "+formatRes); //转发到显示页面 request.getRequestDispatcher("/cal/calRes.jsp").forward(request,response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } } package com.hspeud.utils; public class WebUtils { public static int parseInt(String strNum,int defaultVal){ try { return Integer.parseInt(strNum); } catch (NumberFormatException e) { System.out.println(strNum+"不能转换成整数"); } return defaultVal; } } <%-- User: Linran Date: 2024/3/27 Time: 15:36 Version: 1.0 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> 计算结果 计算结果
<%= request.getAttribute("res")%>
/cal/calUI.jsp">返回再计算一次 <%-- User: Linran Date: 2024/3/27 Time: 20:04 Version: 1.0 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> el表达式的快速入门 el表达式快速入门
<% request.setAttribute("name","林然学java"); %> jsp表达式脚本
名字=<%=request.getAttribute("name")%>
el表达式
名字=${name} EL 表达式常用输出 Bean【javabean】 的普通属性、 数组属性、List 集合属性和 map 集合属性
<%@ page import="com.hspeud.entity.Book" %> <%@ page import="java.util.List" %> <%@ page import="java.util.Map" %> <%@ page import="java.util.ArrayList" %> <%@ page import="java.util.HashMap" %><%-- User: Linran Date: 2024/3/27 Time: 20:18 Version: 1.0 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> el 表达式输出数据演示 el 表达式输出数据演示
<% //创建Book对象,放入相关的属性 // private String name; // private String[] writer;//作者 // private List reader;//读者 // private Map topics;//话题 Book book=new Book(); book.setName("昆虫总动员"); book.setWriter(new String[]{"jack,tom"}); ArrayList readers = new ArrayList<>(); readers.add("林然1"); readers.add("林然2"); book.setReader(readers); HashMap topics = new HashMap<>(); topics.put("topic1","很好看"); topics.put("topic2","不错的电影"); book.setTopics(topics); //把book放入request对象 request.setAttribute("bookId",book); %> book对象:${bookId}
book.name:${bookId.name}
book.writer:${bookId.writer}
book.writer[0]:${bookId.writer[0]}
book.readers: ${bookId.reader}
book.readers[1]:${bookId.reader.get(1)}
book.topics:${bookId.topics}
book.topics(topic1):${bookId.topics.get("topic1")} package com.hspeud.entity; import java.util.Arrays; import java.util.List; import java.util.Map; public class Book { private String name; private String[] writer;//作者 private List reader;//读者 private Map topics;//话题 public String getName() { return name; } public void setName(String name) { this.name = name; } public String[] getWriter() { return writer; } public void setWriter(String[] writer) { this.writer = writer; } public List getReader() { return reader; } public void setReader(List reader) { this.reader = reader; } public Map getTopics() { return topics; } public void setTopics(Map topics) { this.topics = topics; } @Override public String toString() { return "Book{" + "name='" + name + '\'' + ", writer=" + Arrays.toString(writer) + ", reader=" + reader + ", topics=" + topics + '}'; } } 基本语法语法:${ 运算表达式 }






EL 的 11 个隐含对象,可以直接使用
6.1 EL 获取四个特定域中的属性
<%-- User: Linran Date: 2024/3/27 Time: 22:28 Version: 1.0 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> EL 获取四个特定域中的属性 EL 获取四个特定域中的属性
<% pageContext.setAttribute("key1", "pageContext_key1 的值"); pageContext.setAttribute("key2", "pageContext_key2 的值"); request.setAttribute("key1", "request_key1 的值"); session.setAttribute("key1", "session_key1 的值"); application.setAttribute("key1", "application_key1 的值"); %> request域中的k1= ${requestScope.key1}
application 的 key1: ${applicationScope.key1 }
pageContext 的 key1: ${pageScope.key1 }
session 的 key1: ${sessionScope.key1 }
request 的 key1: ${requestScope.key1 }
6.3.2 应用实例
<%-- User: Linran Date: 2024/3/27 Time: 22:40 Version: 1.0 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> pageContext 对象的使用 pageContext 对象的使用
<%--//通过 request 对象来获取和 HTTP 协议相关的数据 request.getScheme() 它可以获取请求的协议 request.getServerName() 获取请求的服务器 ip 或域名 request.getServerPort() 获取请求的服务器端口号 getContextPath() 获取当前工程路径 request.getMethod() 获取请求的方式(GET 或 POST) request.getRemoteHost() 获取客户端的 ip 地址 session.getId() 获取会话的唯一标识--%>
协议: ${ pageContext.request.scheme }
服务器 ip:${ pageContext.request.serverName }
服务器端口:${ pageContext.request.serverPort }
工程路径:${ pageContext.request.contextPath }
请求方法:${ pageContext.request.method }
客户端 ip 地址:${ pageContext.request.remoteHost }
会话 id :${ pageContext.session.id }
使用 jsp 表达式脚本获取如上信息
ip 地址: <%=request.getRemoteHost() %>
使用 el 表达式形式获取信息
<% pageContext.setAttribute("req", request); %> <%-- 简化--%> ip 地址: ${req.remoteHost}
获取请求方法: ${req.method}


taglib 引入标签,要放在行首
导入 jstl jar 包后,要重新发布 web 工程,否则不识别 jstl
<%-- User: Linran Date: 2024/3/28 Time: 8:24 Version: 1.0 To change this template use File | Settings | File Templates. --%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> JSTL快速入门 <%-- c:if 类似 if(10>2){ 输出 } --%> jstl快速入门
2}"> 10>2 成立
3.2 介绍:

多路判断
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%-- User: Linran Date: 2024/3/28 Time: 9:07 Version: 1.0 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> c:choose的使用 <% request.setAttribute("score",90); %> <%-- 如果${requestScope.score} 那么就明确的指定从request域对象取出数据 如果${score},那么就按照从小到大的域范围去获取 --%> =80}"> 成绩优秀
=60}"> 成绩及格
没有及格,下次努力
c:forEach 标签 用来遍历输出, 主要有 4 种形式

<%@ page import="java.util.Map" %> <%@ page import="java.util.HashMap" %> <%@ page import="com.hspeud.entity.Monster" %> <%@ page import="java.util.List" %> <%@ page import="java.util.ArrayList" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%-- User: Linran Date: 2024/3/28 Time: 9:56 Version: 1.0 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> c:forEach 标签 c:forEach 标签
第 1 种遍历方式从 i 到 j
<%-- 1.遍历 1 到 5, 2. 输出 begin 属性设置开始的索引 end 属性设置结束的索引 3. var 属性表示循环的变量(也是当前正在遍历到的数据) 4. 等价 for (int i = 1; i <= 5; i++) {} --%> - 排名=${i}
第 2 种遍历方式:遍历数组
<% request.setAttribute("sports", new String[]{"打篮球", "乒乓球"}); %> <%-- 1. items 遍历的集合 2. var 遍历到的数据 3. 等价 for (Object item: arr) {} --%> 运动名称=${sport}
第 3 种遍历方式:遍历 Map
<% Map map = new HashMap<>(); map.put("key1", "北京"); map.put("key2", "上海"); map.put("key3", "天津"); request.setAttribute("map", map); %> <%--1. items 遍历的 map 集合 2. var 遍历到的数据 3. entry.key 取出 key 4. entry.value 取出值 --%>
城市信息:${city.key}---${city.value}
第 4 种遍历方式:遍历 List
<% List monsters = new ArrayList<>(); monsters.add(new Monster(100, "小妖怪", "巡山的")); monsters.add(new Monster(200, "大妖怪", "做饭的")); monsters.add(new Monster(300, "老妖怪", "打扫位置的")); request.setAttribute("monsters", monsters); %> <%-- items 表示遍历的集合 var 表示遍历到的数据 begin 表示遍历的开始索引值 ,从 0 开始计算 end 表示结束的索引值 step 属性表示遍历的步长值 varStatus 属性表示当前遍历到的数据的状态,可以得到 step,begin,end 等属性值 --%> 妖怪的信息:${monster.id}---${monster.name}--${monster.skill}