JSP学习指南,JSTL表达式,EL表达式,JavaBean,常见问题收集

目录

 

JSTL表达式

1.通用基本标签(set,out,remove)

 2.条件标签

3.循环foreach的使用:

的EL表达式

1.基本用法

2.常用表达式

3.EL表达式操作集合

4.EL表达式的隐式对象

JSP的JavaBean标签用法

 用法1:

用法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指令改成如下:

  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值