据我理解,标签是为了使得jsp内容更加简洁,编写起来更加方便,不用再去在jsp里写大段的java代码,标签就显得与html格外契合;当然,并不是一定要使用标签,只用jsp的语法来写java代码也可以实现功能,只是稍显繁琐。
言归正传,我们在使用标签之前首先需要导入两个依赖
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
导入以来之后,我们的标签就可以使用了。
1.JSP标签
常用的JSP标签有三个,分别为
<jsp:include page=""></jsp:include>
<jsp:forward page=""></jsp:forward>
<jsp:param value="" name=""/>
第一个标签是用来进行网页之间的拼接,page里面写入的是需要拼接页面的路径,前面在网页拼接中已经使用过,在此就不再展示效果;
第二个标签是请求转发,page里面写入的是请求转发到的页面的路径;
第三个标签是通常与上面两个标签混合使用,它的作用是携带一些参数,获取这些参数的方法是request.getParameter(String key),接下来我们结合第二个请求转发的标签做一下测试
首先定义两个页面,一个是pa1.jsp,一个是pa2.jsp
pa1.jsp
<%@page import="java.net.URLEncoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ja1</title>
</head>
<body>
<jsp:forward page="ja2.jsp">
<jsp:param value="jms" name="name"/>
<jsp:param value="100" name="age"/>
</jsp:forward>
</body>
</html>
pa2.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ja2</title>
</head>
<body>
<h1>姓名:<%= request.getParameter("name") %></h1>
<h1>年龄:<%= request.getParameter("age") %></h1>
</body>
</html>
我们访问pa1.jsp,看一下能不能请求到pa2.jsp并读取到数据

没有问题。
2.JSTL标签
常用的JSTL标签是核心标签了
第一步:引用核心标签库的语法:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>,将这一句话加在jsp文件的开头;
我们来说一些常用的标签
(1).<c:if></c:if>和<c:out/>
<c:if></c:if>就还跟程序中的if是一样的,它具有以下三个属性:
test:if的判断条件语句,是必须的;
var:储存条件结果的变量,就是定义一个变量值为true或false,非必须;
scope:var属性的作用域,默认是当前页面(page),非必须;
<c:out/>就是输出语句,也具有三个属性:
value:输出的内容,必须;
default:输出的默认值,默认就是主题内容,非必须;
escapeXml:是否忽略XML特殊字符。默认是true,非必须;
下面我们来看一下这两个标签的实际用法:
建立一个页面coreif.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>coreif</title>
</head>
<body>
<form action="coreif.jsp" method="get">
用户名:<input type="text" name="username" value="${param.username }"><br>
<input type="submit" value="登录"><br>
</form>
<c:if test="${param.username == 'guanliyuan001'}" var="logined">
<c:out value="登陆成功"></c:out>
</c:if>
<c:out value="${logined }"></c:out>
</body>
</html>

然后我们输入用户名为“guanliyuan001”再登陆

(2).<c:set/>和<c:choose></c:choose>
<c:set/>适用于保存数据的标签,它具有五个属性:
var:储存信息的变量;
value:储存的值;
scope:作用域,默认是当前页面(page);
还有两个属性 不常用,在此就不做介绍了。
<c:choose></c:choose>与java switch语句和if else if else语句功能相似,他还有两个子标签<c:when></c:when>和<c:otherwise></c:otherwise>
具体语法如下:
<c:choose>
<c:when test ="">
...
</c:when/>
<c:when test ="">
...
</c:when/>
<c:when test ="">
...
</c:when/>
...
<c:otherwise>
...
</c:otherwise>
</c:choose/>
下面我们来看一下这两个标签的实际用法:
建立一个页面setchose.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>setchoose</title>
</head>
<body>
<form action="setchoose.jsp" method="get">
成绩<input type="text" name="s" value="${param.s }"><br>
<input type="submit"><br>
</form>
<c:set var="score" value="${param.s }"/>
<c:choose>
<c:when test="${score >= 90 }">
<h1>成绩优秀</h1>
</c:when>
<c:when test="${score >= 80 }">
<h1>成绩良好</h1>
</c:when>
<c:when test="${score >= 70 }">
<h1>成绩一般</h1>
</c:when>
<c:when test="${score >= 60 }">
<h1>成绩及格</h1>
</c:when>
<c:when test="${score >= 0 }">
<h1>成绩不及格</h1>
</c:when>
<c:otherwise>
<h1></h1>
</c:otherwise>
</c:choose>
</body>
</html>




(3).<c:forEach></c:forEach>
这个标签封装了java的for、while、dowhile循环,它具有以下属性:
| 属性 | 描述 | 是否必要 | 默认值 |
|---|---|---|---|
| items | 要被循环的信息 | 否 | 无 |
| begin | 开始的元素(0=第一个元素,1=第二个元素) | 否 | 0 |
| end | 最后一个元素(0=第一个元素,1=第二个元素) | 否 | Last element |
| step | 每一次迭代的步长 | 否 | 1 |
| var | 代表当前条目的变量名称 | 否 | 无 |
| varStatus | 代表循环状态的变量名称 | 否 | 无 |
接下来我们演示以下它的实际用法:
建立一个页面foreach.jsp
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>foreach</title>
</head>
<body>
<%
ArrayList<String> arry = new ArrayList<>();
arry.add("this is 1");
arry.add("this is 2");
arry.add("this is 3");
arry.add("this is 4");
arry.add("this is 5");
request.setAttribute("number", arry);
%>
<c:forEach var = "num" items="${number }">
<c:out value="${num }"/><br>
</c:forEach>
<c:forEach var = "i" begin="1" end="5">
i =<c:out value="${i }"/><br>
</c:forEach>
</body>
</html>

3.EL表达式
EL 表达式语法如下:
${EL表达式}
(本文仅作个人学习记录用,如有纰漏,敬请指正)
我试图使用yard记录一些Ruby代码,尽管我所做的正是所描述的here或here#@param[Integer]thenumberoftrials(>=0)#@param[Float]successprobabilityineachtrialdefinitialize(n,p)#initialize...end虽然我仍然得到这个奇怪的错误@paramtaghasunknownparametername:the@paramtaghasunknownparametername:success然后生成的html看起来很奇怪。我称yard为:$yarddoc-mmarkdown我做错了什么?
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg
我有一个div,它根据表单是否正确提交而改变。我想知道是否可以检查类的特定元素?开始元素看起来像这样。如果输入不正确,添加错误类。 最佳答案 试试这个:browser.div(:id=>"myerrortest").class_name更多信息:http://watir.github.com/watir-webdriver/doc/Watir/HTMLElement.html#class_name-instance_method另一种选择是只查看具有您期望的类的div是否存在browser.div((:id=>"myerrortes
@raw_array[i]=~/[\W]/非常简单的正则表达式。当我用一些非拉丁字母(具体来说是俄语)尝试时,条件是错误的。我能用它做什么? 最佳答案 @raw_array[i]=~/[\p{L}]/使用西里尔字符进行测试。引用:http://www.regular-expressions.info/unicode.html#prop 关于ruby-正则表达式将非英文字母匹配为非单词字符,我们在StackOverflow上找到一个类似的问题: https://
我需要一个非常简单的字符串验证器来显示第一个符号与所需格式不对应的位置。我想使用正则表达式,但在这种情况下,我必须找到与表达式相对应的字符串停止的位置,但我找不到可以做到这一点的方法。(这一定是一种相当简单的方法……也许没有?)例如,如果我有正则表达式:/^Q+E+R+$/带字符串:"QQQQEEE2ER"期望的结果应该是7 最佳答案 一个想法:你可以做的是标记你的模式并用可选的嵌套捕获组编写它:^(Q+(E+(R+($)?)?)?)?然后你只需要计算你获得的捕获组的数量就可以知道正则表达式引擎在模式中停止的位置,你可以确定匹配结束
我想从then子句中访问case语句表达式,即food="cheese"casefoodwhen"dip"then"carrotsticks"when"cheese"then"#{expr}crackers"else"mayo"end在这种情况下,expr是食物的当前值(value)。在这种情况下,我知道,我可以简单地访问变量food,但是在某些情况下,该值可能无法再访问(array.shift等)。除了将expr移出到局部变量然后访问它之外,是否有直接访问caseexpr值的方法?罗亚附注我知道这个具体示例很简单,只是一个示例场景。 最佳答案
这是一个例子:s="abcd+subtext@example.com"s.match(/+[^@]*/)Result=>"+subtext"问题是,我不想在其中包含“+”。我希望结果是“潜台词”,没有+ 最佳答案 您可以在正则表达式中使用括号来创建匹配组:s="abcd+subtext@example.com"s=~/\+([^@]*)/&&$1=>"subtext" 关于ruby-正则表达式-排除一个字符,我们在StackOverflow上找到一个类似的问题:
我们有一个字符串:“”这个正则表达式://i如何从当前字符串中获取所有匹配项? 最佳答案 "".scan(//)参见scan在ruby-docs上 关于ruby-如何遍历Ruby中所有正则表达式匹配的字符串?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6857852/
我正在尝试通过正则表达式拆分参数列表。这是一个带有我的参数列表的字符串:"a=b,c=3,d=[1,3,5,7],e,f=g"我想要的是:["a=b","c=3","d=[1,3,5,7]","e","f=g"]我试过先行,但Ruby不允许使用动态范围后行,所以这行不通:/(?如何让正则表达式忽略方括号中的所有内容? 最佳答案 也许这样的东西对你有用:str.scan(/(?:\[.*?\]|[^,])+/)编辑再三考虑。简单的非贪婪匹配器在某些嵌套括号的情况下会失败。 关于Ruby正则
我想找到给定字符串中的所有匹配项,包括重叠匹配项。我怎样才能实现它?#Example"a-b-c-d".???(/\w-\w/)#=>["a-b","b-c","c-d"]expected#Solutionwithoutoverlappedresults"a-b-c-d".scan(/\w-\w/)#=>["a-b","c-d"],but"b-c"ismissing 最佳答案 在积极的前瞻中使用捕获:"a-b-c-d".scan(/(?=(\w-\w))/).flatten#=>["a-b","b-c","c-d"]参见Rubyde