Jsp 和 EL表达式 和 JSTL标签库

前言-------    每一天总会有各种各种样的事情,但是不论如何,必须要坚持下去!!

JSP的详解

什么是jsp

在普通人眼里jsp就是一个页面。在程序员眼中,jsp就是一个Servlet类,java代码

为什么使用jsp

html大多数是显示的静态页面,是一成不变的。有的时候,我们需要显示一些动态的数据,比如查询学生的信息,根据学生的姓名去查询某个具体的学生,需要查询数据库。而html是不支持java语言的

为了能够动态的显示数据,所以要在页面中插入java代码,所以出来了jsp技术。

jsp的基本用法

jsp的指令

page指令、include指令、taglib指令

指令的写法:

<%@ 指令的名字 具体的动作(比如各种属性) %>
  • page指令
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>

language="java":表明jsp页面中可以写java代码

content-Type="text/html; charset=utf-8":表明告诉浏览器我这个文件的内容类型和使用的编码

text/html  MIMEType 这是一个文本,html网页

pageEncoding=“utf-8”:表明使用的内容编码是utf8

extends="  父类":用于指定jsp翻译成java代码后继承的父类是谁。一般不用改

import=“包路径”:用于导包,一般不手动写

session=“true/false”:

默认是true,表明jsp页面能够使用session(HttpSession)对象,false表明不可以使用。
在具体的编译成java代码后,如果是true能够使用session,java代码中会有getSession()方法。

如果是false,java代码中没有该方法。

errorPage=“error.jsp ”:

表明当前的jsp页面出现错误的时候跳转到error.jsp,值需要给错误的页面路径,在error.jsp页面中的page指令也要配合相应的属性

isErroePage="true/false" :

上面的errorPage 用于指定错误的时候跑到哪一个页面去。 那么这个isErroPage , 就是声明某一个页面到底是不是错误的页面。

true表示是
  • include指令

include包含的意思

<%@ include file="one.jsp" %>

表明把另外一个one.jsp的内容包含进来。

file=“one.jsp”:表示要包含的jsp的具体的路径。

 注意:这是静态包含:先把one.jsp中的内容全部拿到当前的页面(包括各种标签),然后再一起编译。

在jap动作标签中<jsp:include page="one.jsp"></jsp:include>是动态包含,先编译好one.jsp的内容,然后再包含进来。

include包含内部java代码

  • taglib指令

运用于JSTL标签库

<%@ taglib prefix="" uri="" %>

 

prefix:标签库的别名

uri:标签库的地址

 

jsp的动作标签

常用的jsp动作标签

<jsp:include page=""></jsp:include>

<jsp:forward page=""></jsp:forward>

<jsp:param value="" name=""/>

 

  • <jsp:include page="one.jsp" ></jsp:include>

动态包含,先把one.jsp的页面编译出来,把内容放到当前的页面。也就是不把包含的页面所有元素标签全部拿过来输出,而是把它的运行结果拿过来。以后都用动态包含。内部java代码

  • <jsp:forward page="two.jsp"></jsp:forward>

请求转发,转发到具体的页面。转发到two.jsp页面。服务器内部转发. 相当于Servlet中的如下代码

request.getRequestDispatcher("two.jsp").forward(request,response);

  • <jsp:param value="beijing" name="city" />

在包含某个页面 或者在跳转某个页面加入这个参数

<jsp:forward page="other02.jsp">
        <jsp:param name="address" value="beijing"></jsp:param>
</jsp:forward>


在other.jsp中获取参数的值
<%=request.getParameter("city") %>

内部代码如下,相当于在url后面跟上了参数  http://localost:8080/JspServlet/other02.jsp?adress=beijing

jsp的九大内置对象

所谓的jsp内置对象就是我们在jsp页面中直接使用,不用创建

pageContext、request、session、application 四大作用域对象

response、out、excation、page、config   

一共九大内置对象

  • 四大作用域对象,对应的java类

作用域

表示这些对象可以存值,但是取值的范围有限定

setAttribute("name","value");    使用该方法存值

getAttribute("name");  使用该方法获取值,返回的是Object对象

四大作用域对象都有这两个方法

使用作用域来存储数据<br>
<%
		pageContext.setAttribute("name", "page");
		request.setAttribute("name", "request");
		session.setAttribute("name", "session");
		application.setAttribute("name", "application");
%>


取出四个作用域中的值<br>
	
	<%=pageContext.getAttribute("name")%>
	<%=request.getAttribute("name")%>
	<%=session.getAttribute("name")%>
	<%=application.getAttribute("name")%>

作用域范围的大小:pageContext <<  request <<  session <<application

四个作用域的区别

pageContext【PageContext】

作用仅限于当前页面。
还可以获得其他的八大内置对象  pageContext.getXXX();

request【HttpServletRequest】

作用域只限于一次的请求,只要服务器对请求做了相应,这个域中的值就没有了

session【HttpSession】

作用域限于一次会话,多次的请求和响应,不同的浏览器访问不属于一个会话

application【ServletContext】

整个工程都可以访问,不同的浏览器不同的会话都可以访问,服务器关闭就不可以了
  • 其他五大内置对象

out【JspWriter】对象和response【HttpServletResponse】对象的区别

excetion【Throwable】

page【Oject,HttpJspPage】这个就是jsp翻译成java类的实例对象

config【ServletConfig】

 

EL表达式

EL表达式的作用

为了简化jsp代码,其实就是简化在jsp中的java代码。使用EL表达式就是简化取值的代码。(取值操作

都是从一个对象中取出它的属性值,比如取出某一个学生的姓名。

EL表达式的写法格式

${表达式   }

如果从域中取值,会先从小的作用域开始,如果没有,再依次扩大作用域的范围。直到把四大作用域都取完都没有,就没有显示

EL的十一大内置对象

作用域相关的对象  (其实就是Map对象)

pageScope

requestScope

sessionScope

applicationScope

头信息相关的对象  (其实就是Map对象)

header

headValues

参数相关的对象  (其实就是Map对象)

param

paramValues

cookie

全局初始化参数相关对象 (其实就是Map对象)

initParam

=========================================================================================

pageContext(和jsp内置对象pageContext一样,使用方法有点区别,EL中使用的是  . 没有getXX方法什么的 )

EL表达式的具体使用

  • 取出四个作用域存放的值
<%
		pageContext.setAttribute("name", "page");
		request.setAttribute("name", "request");
		session.setAttribute("name", "session");
		application.setAttribute("name", "application");
%>

普通的手段取值
<%
    pageContext.getAttribute("name")
    request.getAttribute("name");
    session.getAttribute("name");
    application.getAttribute("name");
%>

EL表达式的取值手段
${pageScope.name}
${requestScope.name}
${sessionScope.name}
${applicationScope.name}
  • 取出作用域存放的数组
<% 
    String [] a = {"aa","bb","cc","dd"}; 
    pageContext.setAttribute("array", a);
 %> 
 
使用EL表达式取数组
${pageScope.array[0]}, ${pageScope.array[1]}, ${pageScope.array[2]}, ${pageScope.array[3]},
  • 取出作用域存放的集合
<%
    List<String> li = new ArrayList();
    li.add("11");
    li.add("22");
%>

使用EL“表达式取值,相当于取第0个对象,取第一个对象
${li[0]}, ${li[1]}
  • 取出Map集合中的数据
<%
    Map map = new HashMap();
    map.put("name","haha");
    map.put("age",18);
    map.put("address.aa","beijing");
    application.setAttribute("map",map);
%>

使用EL取出map集合中的数据,取出来的是一个对象,之后就去这个对象中的元素
${applicationScope.map.name},
可以省略applicationScope,这样取值的话麻烦一点,先从小的作用域开始
${map.name}
如果最后一项key出现了address.aa这种 .  的特殊字符使用 [] 取值
${map["address.aa"]}
  • EL表达式取值细节

1、从域中取值,得先存值

<%
    //pageContext.setAttribute("name", "zhangsan");
    session.setAttribute("name", "lisi...");
%>    

直接指定取值的范围,就是直接说要在哪个域里面进行取值,如果没有,也不会去其他域里面找

${pageScope.name}

如果没有指明范围,把pageScope省略,

${name}    先从page里面找,没有去request找,去session,去application

取值先从最小的作用域开始找,pageContext -->  request -->session --->application

2、取值方式

如果这份值是有下标的,那么直接使用   [  ]  取值

<%
	String [] array = {"aa","bb","cc"}
	session.setAttribute("array",array);
%>
${ array[1] } --> 这里array说的是attribute的name 

如果这份值没有下标,直接使用  .  的方式去取值

<%
	User user = new User("zhangsan",18);
	session.setAttribute("u", user);
%>

${ u.name }  , ${ u.age } 

JSTL标签库

JSTL的作用

全称:Jsp Standard Tag Library

因为EL表达式只能做一些取值的操作,像一些循环遍历等的操作不可以,所以出来了引入第三方的jar包,JSTL标签库

一般简化了jsp中的<%%>和其中的java代码,配合EL表达式使用

JSTL的使用

1、导入jar文件到web资源目录下的 web/WEB_INF/lib 目录下   jstl.jar  standard.jar

2、在jsp页面中使用  taglib 指令 引入标签库

注意,引用的时候如果想支持EL表达式,必须选1.1的版本,1.0的版本不支持EL表达式

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
prefix="c"  : 是为引入的核心标签库core中的标签起了个别名
uri:引入的JSTL标签库的路径

常用的标签库

设置属性值,并默认存在pageContext域中
<c:set></c:set>

if语句,test是判断的内容
<c:if test=""></c:if>

for循环,items要循环的变量,var每次循环接收的参数
<c:forEach var="" items="">
    
</c:forEach>
  • <c:set></c:set>
相当于String name = "zhangsan" 保存在session域中
<!-- 声明一个对象name, 对象的值 zhangsan , 存储到了pageContext(默认) , 指定是session -->
  <c:set var="name" value="zhangsan" scope="session"></c:set>
  ${name }
  • <c:if test=""></c:if>

判断test里面的表达式是否满足,如果满足,就执行c:if标签中的输出 , c:if 是没有else的。

<c:set var="age" value="18" ></c:set>
<c:if test="${ age > 26 }">
		年龄大于了26岁...
</c:if>
	
<c:if test="${ age <= 26 }">
		年龄小于了26岁...
</c:if>


定义一个变量名 flag  去接收前面表达式的值,然后存在session域中

<c:if test="${ age > 26 }" var="flag" scope="session">
		年龄大于了26岁...
</c:if>
  • <c:forEach var="" items=""> </c:forEach>
从1 开始遍历到10 ,得到的结果 ,赋值给 i ,并且会存储到page域中, step , 增幅为2, 
	<c:forEach begin="1" end="10" var="i" step="2">
		${i }
	</c:forEach>

	-----------------------------------------------

	 items : 表示遍历哪一个对象,注意,这里必须写EL表达式。 
	var: 遍历出来的每一个元素用user 去接收。 
	<c:forEach var="user" items="${list }">
		${user.name } ----${user.age }
	</c:forEach>

案例:学生信息管理系统

案例分析:

代码实现:

dao层:业务的定义层(接口)    UserDao.java    StudentDao.java

daoImpl:业务的具体实现层(接口实现类)    UserDaoImpl.java   StudentDaoImpl.java

servlet:具体与页面交互层的Servlet 。   Login_Servlet.java       

util:工具层  ---  连接数据库   JDBCUtil.java

domain:需要自定义的对象,对象层,存储用户信息。 Student.java

  • login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录页面</title>
</head>
<body>
<br><h3>用户登录页面</h3><br>
<form action="loginServlet" method="post" >
    用户名:<input type="text" name="username"><br>
    密码:&nbsp&nbsp <input type="password" name="password"><br>
    <input type="submit" value="登录">
</form>
</body>
</html>
  • Login_Servlet.java
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        //提交的数据有可能有中文, 怎么处理。
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");

        //1、获取用户名和密码
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println(username+"  "+password);

        try {
            //2、查询数据库,看是否有该用户,有的话登录成功,否则失败
            // 2. 去访问dao , 看看是否满足登录。
            UserDao dao = new UserDaoImpl();
            boolean isSuccess = dao.login(username, password);

            //3. 针对dao的返回结果,做出响应
            if(isSuccess){
                //怎么样在页面中浏览学生的信息数据?  先查询,在保存到作用域中,响应时候带着数据
                //1、查询数据库中学生信息表的数据,每个学生是一个对象,多个学生存一个集合,并返回一个list集合
                StudentDao stu = new StudentDaoImpl();
                List<Student> list = stu.findStudent();

                //2、把list集合存在作用域中
                HttpSession session = request.getSession();
                session.setAttribute("list",list);

                //3、跳转页面,重定向
                response.sendRedirect("stu_list.jsp");

            }else{
                response.getWriter().write("用户名或密码错误");
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }

    }
  • UserDao.java   和  UserDaoImpl.java
package com.web.dao;

import java.sql.SQLException;
/**
 * 该dao定义了对用户表的访问规则
 */
public interface UserDao {
    //实现登录功能,登录成功,返回true ,登录失败,返回false
    //在实际应用开发中,一般登录成功,返回这个用户的个人信息
    boolean login(String userName, String passWord) throws SQLException;

}
public class UserDaoImpl implements UserDao {
    @Override
    //实现定义的方法
    public boolean login(String userName, String passWord) {
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            //1. 得到连接对象
            con = JDBCUtil.getCon();
            String sql = "select * from user where username=? and password =?";
            //2. 创建ps对象
            ps = con.prepareStatement(sql);
            ps.setString(1,userName);
            ps.setString(2,passWord);
            //开始执行
            rs = ps.executeQuery();
            //如果能够成功移到下一条记录,那么表明有这个用户。
            return rs.next();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtil.closeResource(rs,ps,con);
        }
        return false;
    }
}
  • StudentDao.java   和  StudentDaoImpl.java
public interface StudentDao {
    //查询出所有学生的信息.返回List集合
    List<Student> findStudent();

}
public class StudentDaoImpl implements StudentDao {
    @Override
    public List<Student> findStudent() {
        List <Student> list = new ArrayList<Student>();
        try {
            Connection con = JDBCUtil.getCon();
            String sql = "select * from student";
            PreparedStatement ps = con.prepareStatement(sql);
            ResultSet rs = ps.executeQuery();

            //一个信息存变量,多个信息存对象,多个对象存集合
            while (rs.next()){//每遍历一次,是一个学生的信息,遍历多次,就是多个学生的信息
                Student stu = new Student();
                stu.setName(rs.getString("name"));
                stu.setId(rs.getInt("id"));
                stu.setAge(rs.getInt("age"));
                stu.setSex(rs.getString("sex"));
                stu.setAddress(rs.getString("address"));
                list.add(stu);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return list;
    }
  • Student.java
public class Student {
    //你如果想要在页面上显示几个信息,这地方就写几个变量。
    //而不是根据你在数据库表中定义的几列就写几个变量,是根据你想要在页面上显现几列而定义几个变量
    private int id;
    private String name;
    private int age;
    private String sex;
    private String address;

    //为了方便,向外提供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 int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}
  • stu_list.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>学生信息管理页面</title>
</head>
<body>
<h3>学生信息管理</h3>
<table border="1" width="700px">
    <tr align="center">
        <td>学生编号</td>
        <td>姓名</td>
        <td>年龄</td>
        <td>性别</td>
        <td>住址</td>
        <td>操作</td>
    </tr>

    <c:forEach items="${sessionScope.list}" var="stu">
        <tr align="center">
            <td>${stu.id}</td>
            <td>${stu.name}</td>
            <td>${stu.age}</td>
            <td>${stu.sex}</td>
            <td>${stu.address}</td>
            <td><a href="#">修改</a>&nbsp;&nbsp;<a href="#">删除</a></td>
        </tr>
    </c:forEach>
</table>

</body>
</html>

总计图谱

 

猜你喜欢

转载自blog.csdn.net/weixin_44142032/article/details/88693223
今日推荐