目录
用法2(快速将表单数据封装为实体对象,并提交给Servlet做业务处理)
JSTL表达式
JSTL(Java Server Page Standard Tag Library) JSP标准标签库,用来替代JSP页面脚本,它与EL(Expression Language)配合可以有效地减少JSP页面中的Java代码。
1.通用基本标签(set,out,remove)
<%--var:变量名,value:变量值--%>
<c:set var="count" value="99" />
<c:out value="${count}"/><hr>
<%--如果变量未被定义值,可声明默认值--%>
<c:out value="${happy}" default="我是默认值"/><hr>
<%--移除值--%>
<c:remove var="count"/>
<c:out value="${count}"/><hr>
输出结果:
2.条件标签
<c:if test="${8>4}">
<h3>你好 2020</h3>
</c:if>
<c:set var="score" value="70"/>
<c:choose>
<c:when test="${score>=90 }">优秀</c:when>
<c:when test="${score>=80 }">良好</c:when>
<c:when test="${score>=70 }">中等</c:when>
<c:when test="${score>=60 }">及格</c:when>
<c:otherwise>不及格</c:otherwise>
</c:choose>
其中要注意两点
- 无<c:else>标签
- choose,when组合即Java中Swith语句的效果
3.循环foreach的使用:
一.简单循环:
<c:forEach var="i" begin="0" end="10" step="2">
${i}<br>
</c:forEach><hr>
二.集合的遍历:
新建TestServlet.java:
package com.qianqian.practice.servlet;
import com.qianqian.practice.entity.User;
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 = "TestServlet", value = "/test")
public class TestServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List<User> userList=new ArrayList<>();
userList.add(new User("4567654","李华","7545","man"));
userList.add(new User("5452545","张梁","8775","woman"));
userList.add(new User("6456455","康康","2421","woman"));
userList.add(new User("1312313","小明","5457","man"));
request.setAttribute("userList",userList);
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
}
index.jsp:
<body>
<table border="1" width="30%" bordercolor="black" cellspacing="0" align="center">
<tr>
<th>ID</th>
<th>NAME</th>
<th>PASSWORD</th>
<th>GENDER</th>
</tr>
<c:forEach items="${userList}" var="user">
<tr>
<td>${user.userId}</td>
<td>${user.userName}</td>
<td>${user.userPassword}</td>
<td>${user.userGender}</td>
</tr>
</c:forEach>
</table>
</body>
结果:
的EL表达式
JSP的设计目的就是为了解决Servlet在视图层的复杂应用,因此要尽可能的少出现java代码,EL(Expression Language)表达式的出现很好的解决了这个问题:
格式:${表达式}
1.基本用法
新建一个实体类User
package com.qianqian.practice.entity;
/**
* 用户实体
*/
public class User {
private String userId;
private String userName;
private String userPassword;
private String userGender;
public User(String userId, String userName, String userPassword, String userGender) {
this.userId = userId;
this.userName = userName;
this.userPassword = userPassword;
this.userGender = userGender;
}
}
然后再TestServlet.java新建对象并转发
package com.qianqian.practice.servlet;
import com.qianqian.practice.entity.User;
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 = "TestServlet", value = "/test")
public class TestServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
User user = new User("4646794654", "小可爱", "4455455", "女");
request.setAttribute("user1", user);
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
}
接下来就要在index.jsp中来接受此对象了,如下:
<%@ page import="com.qianqian.practice.entity.User" %><%--
Created by IntelliJ IDEA.
User: Swing
Date: 2020/1/20
Time: 9:46
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" %>
<html>
<head>
<title>Expression Language</title>
</head>
<body>
<%--如果未声明作用域,则更具作用域从小到大查找--%>
userId:${user1.userId}<br>
userName:${user1.userName}<br>
userPassword:${user1.userPassword}<br>
<%--如果声明了作用域,则在此作用域中查找--%>
userGender:${requestScope.user1.userGender}<br>
</body>
</html>
2.常用表达式
基本表达式与Java类似,如下举例:
算术运算
${10+20 }<br/>
${10-20 }<br/>
${10*20 }<br/>
${3%5}<br/>
关系运算
${10==9 }<br/>
${"abc"=="abc" }<br/>
${s1==s2 } equals<br/>
${s1 eq s2 }<br/>
${10>20}<br/>
${10 gt 20}<br/>
${5 < 10}<br/>
${5 lt 10}<br/>
${5 != 10}<br/>
${5 ne 10}<br/>
三目运算
${score>80?"优秀":"一般" }<br/>
${flag==0?"没有激活":flag==1?"激活":"删除" }<br/>
${sex==0?"男":"女" }<br/>
逻辑运算
${true && false}<br/>
${true || false}<br/>
${!true}<br/>
${true and false}<br/>
${true or false}<br/>
${not true}<br/>
此处要特别注意empty关键字
<%
String s1 = "";
String s2 = null;
String s3 = "122222";
List list1 = new ArrayList();
pageContext.setAttribute("s1", s1);
pageContext.setAttribute("s2", s2);
pageContext.setAttribute("s3", s3);
pageContext.setAttribute("list1", list1);
%>
<!-- empty关键只要内容是空true -->
${empty s1}<br>
${empty s2}<br>
${empty s3}<br>
${empty list1}<br>
3.EL表达式操作集合
<%
List<String> stringList=new ArrayList<>();
stringList.add("a");
stringList.add("b");
stringList.add("c");
application.setAttribute("list",stringList);
Map<String,String> stringStringMap=new HashMap<>();
stringStringMap.put("A","abstract");
stringStringMap.put("B","bool");
stringStringMap.put("C","character");
application.setAttribute("map",stringStringMap);
%>
List:<br>
${list}<br>
${list[0]}<br>
${list.get(1)}<br>
<br>Map:<br>
${map}<br>
${map.keySet()}<br>
${map.values()}<br>
${map.A}<br>
${map["B"]}<br>
4.EL表达式的隐式对象
大部分对应的是JSP的内置对象,由于不提倡在JSP中过多的使用Java代码,所有将内置对象映射到EL表达式的隐式对象
pageContext:页面上下文,可以获取jsp中其他八个内置对象
pageScope、requestScope、sessionScope、applicationScope表示四个域对象中集合
param 表示request.getParameter("username"); ${param.username}
paramvalues 表示request.getPrameterValues("hobby"); ${paramValues.hobby}
header 表示 request.getHeader("accept"); ${header.accept};
headerValues 表示 request.getHeaderValues("accept-encoding"); ${headerValues"accept-encoding"}
cookie 表示 request.getCookies(); ${cookie.JSESSIONID}
initParam 表示 ServletContext(application)初始化参数
JSP的JavaBean标签用法
jsp:useBean 创建一个对象 id class
jsp:setProperty给指定的对象属性赋值 name property value
jsp:getProperty取出指定的对象属值 name property
首先新建一个实体类,用来说明此动作标签的用法:
package com.qianqian.practice.entity;
/**
* 用户实体
*/
public class User {
private String userId;
private String userName;
private String userPassword;
private String userGender;
@Override
public String toString() {
return "User{" +
"userId='" + userId + '\'' +
", userName='" + userName + '\'' +
", userPassword='" + userPassword + '\'' +
", userGender='" + userGender + '\'' +
'}';
}
}
用法1:
进行简单的新建类对象,在index.jsp中使用如下代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>结果</title>
</head>
<body>
<%--实例化一个对象,id为对象标识,class为对象类地址--%>
<jsp:useBean id="user" class="com.qianqian.practice.entity.User"/>
<%--设置对象成员变量--%>
<jsp:setProperty name="user" property="userId" value="748387483"/>
<jsp:setProperty name="user" property="userName" value="阿狗"/>
<jsp:setProperty name="user" property="userPassword" value="12345"/>
<jsp:setProperty name="user" property="userGender" value="男"/>
<%--获取成员变量--%>
<jsp:getProperty name="user" property="userId"/><br>
<jsp:getProperty name="user" property="userName"/><br>
<jsp:getProperty name="user" property="userPassword"/><br>
<jsp:getProperty name="user" property="userGender"/><br>
</body>
</html>
运行服务器,访问index.jsp,结果如下:
很明显,以上用法,也可以使用new关键字示例化对象,再使用set/get方法即可替代
用法2(快速将表单数据封装为实体对象,并提交给Servlet做业务处理)
新建login.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form method="post" action="index.jsp">
用户id<input type="text" name="userId"/><br>
用户名<input type="text" name="userName"/><br>
用户密码<input type="password" name="userPassword"/><br>
性别
<input type="radio" name="userGender" value="女" checked/>女
<input type="radio" name="userGender" value="男"/>男<br>
<input type="submit" value="提交">
</form>
</body>
</html>
将index.jsp中的内容改成如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" %>
<html>
<head>
<title>结果</title>
</head>
<body>
<%--实例化一个对象,id为对象标识,class为对象类地址--%>
<jsp:useBean id="user" class="com.qianqian.practice.entity.User"/>
<%--可从表单中自动获取对应实体的所有属性,完成实体类对象的构建--%>
<jsp:setProperty name="user" property="*"/>
用户名id:<jsp:getProperty name="user" property="userId"/><br>
用户名:<jsp:getProperty name="user" property="userName"/><br>
用户密码:<jsp:getProperty name="user" property="userPassword"/><br>
性别:<jsp:getProperty name="user" property="userGender"/><br>
</body>
</html>
此处可能会出现中文乱码,简单的一个过滤器即可解决
EncodeFilter.java:
package com.qianqian.practice.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter(filterName = "EncodeFilter",value = "/*")
public class EncodeFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
}
}
运行tomcat服务器,输入信息,点击提交,结果如下
由此可以体现出JavaBean在处理表单对象的便捷优势,我们可以将表单信息封装成对象,转发到servlet处理:
index.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" %>
<html>
<head>
<title>结果</title>
</head>
<body>
<%--实例化一个对象,id为对象标识,class为对象类地址--%>
<jsp:useBean id="user" class="com.qianqian.practice.entity.User"/>
<%--可从表单中自动获取对应实体的所有属性,完成实体类对象的构建--%>
<jsp:setProperty name="user" property="*"/>
<%
request.setAttribute("userInstance", user);
request.getRequestDispatcher("/test").forward(request, response);
%>
</body>
</html>
TestServlet.java:
package com.qianqian.practice.servlet;
import com.qianqian.practice.entity.User;
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 = "TestServlet", value = "/test")
public class TestServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
User user = (User) request.getAttribute("userInstance");
System.out.println(user.toString());
}
}
点击提交,控制台输出如下:
说明对象成功传到Servlet中。
常见问题收集
在使用JSTL的 c 标签时,出现下面小问题
解决方法:
将taglib指令改成如下: