天天看点

JavaWeb学习记录 Day5(JSP进阶)

文章目录

  • ​​Day 5​​
  • ​​JSP指令​​
  • ​​JSP标签​​
  • ​​JSTL标签库​​
  • ​​EL表达式​​
  • ​​过滤器​​

Day 5

2019年7月17日。

这是我学习JavaWeb的第五天。

这一天,我学到了以下的知识。

JSP指令

语法

<%@ 指定名 属性名=属性值:[属性名=属性]... @%>      

在JSP中,只有三种指令:page、include、tarlib

  1. page指令
  • autoFlush:自动刷新(true,false:默认)
  • contentType:页面文本类型"text/html"
  • errorPage:如果存在错误页面,就跳转至指定的页面【不推荐使用,但需要掌握】

    可以在web.xml配置<.error-page>标签接下来的属性:

    - error-code:错误码

    - location:错误页面

    - exception-type:异常类型

  • language:JSP使用的语言,默认是Java
  • pageEncoding:页面编码
  • import:因为jsp本质上是一个servlet,所以需要导入相关jar包才能使用
  1. include指令(需要掌握)

    导入其他页面包含到本页,网站中一般有一些公用的位置,我们可以提取出来,比如网站的头部和尾部

    file属性:【要导入页面,一般都是不完整的网页,只包含部分】

  2. taglib指令

    标签库,在jsp中有大量的java代码,所以开发中可以使用一些线程的标签库,就相当于使用一些替代java代码的标签语言

    例如:

    out.print() —> <c:out> :这个c就是别人定义好的标签库,像这样的库有非常多,甚至可以自己定义

page-errorPage命令测试

在 web.xml中,指定一个页面作为404错误时的页面,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <error-page>
        <error-code>404</error-code>
        <location>/common/header.jsp</location>
    </error-page>
    <error-page>
        <error-code>500</error-code>
        <location>/common/footer.jsp</location>
    </error-page>
</web-app>      

include命令测试

在项目目录中新建一个header.jsp和footer.jsp,在这两个页面中分别编写代码,然后再在index.jsp中使用include指令将这两个页面合并起来,代码如下:

  • header.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
</head>
<body>
<h1>我是header页面</h1>
</body>
</html>      
  • footer.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
</head>
<body>
<h1>我是footer页面</h1>
</body>
</html>      
  • index.jsp
<html>
  <head>
  </head>
  <body>
  <%--使用include指定加载网页其他部分--%>
  
  <%@include file="common/header.jsp"%>

  <h1>我是index页面</h1>
  
  <%@include file="common/footer.jsp"%>
  </body>
</html>      

JSP标签

作用

避免在JSP中有大量的Java代码,从而不好维护

语法

<jsp:xxx>      

常用JSP标签

  1. jsp:include

    page属性:用于表示要包含的页面地址

  2. jsp:forward

    本质:就是request的请求转发,可以携带参数

    page属性:表示要转发到的页面,不会改变url

  3. jsp:param

    作用:一般配合jsp:forwad使用

  4. jsp:useBean

    作用:用于引入一个自定义的对象

  5. jsp:setProperty

    作用:用于设置自定义对象的属性值,常与jsp:setProperty标签配合,默认使用的是实体类中的set方法

  6. jsp:getProperty

    作用:用于获取自定义对象的属性值,常与jsp:getProperty标签配合,默认使用的是实体类中的get方法

jsp:forward和jsp:param标签测试

项目中有两个jsp页面:index.jsp和tag.jsp,在tag.jsp中设置相应的参数值,从而可以在index.jsp接收到,代码如下:

  • tag.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<%--<jsp:include page="tag.jsp"/>
<h1>我是tag页面</h1>
<jsp:include page="common/header.jsp"/>--%>

<jsp:forward page="index.jsp">
    <jsp:param name="username" value="abc"/>
    <jsp:param name="age" value="18"/>
</jsp:forward>
</body>
</html>      
  • index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>
  <head>
  </head>
  <body>
  <%--使用include指定加载网页其他部分--%>
  
  <%@include file="common/header.jsp"%>

  <h1>我是index页面</h1>
  
  <%@include file="common/footer.jsp"%>

  名字:<%=request.getParameter("username")%>
  年龄:<%=request.getParameter("age")%>
  </body>
</html>      

jsp:useBean标签测试

项目中有一个实体类:Student类,通过pojo.jsp获取该类的对象,并且设置和显示对象中的属性值,代码如下:

  • Student.java
public class Student {

    // 面向对象编程三大特性:封装、继承、多态
    // 封装:属性私有,不让用户随意操作,于是我们设置操作属性的公开方法,我们会在公开的方法中定义安全性代码

    private String name;
    private int id;
    private int age;
    private boolean isGraduate; // 是否毕业

    public Student() {
    }

    public Student(String name, int id, int age, boolean isGraduate) {
        this.name = name;
        this.id = id;
        this.age = age;
        this.isGraduate = isGraduate;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getAge() {
        return age;
    }

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

    public boolean isGraduate() {
        return isGraduate;
    }

    public void setGraduate(boolean graduate) {
        isGraduate = graduate;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", id=" + id +
                ", age=" + age +
                ", isGraduate=" + isGraduate +
                '}';
    }
}      
  • pojo.jsp
<%@ page import="pojo.Student" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>


<%
    Student student = new Student();
%>

<%--
jsp:useBean标签
    创建一个类的实例化对象;
    java代码:Student student = new Student();

    属性:
        id:实例化对象的名称,对象名
        class:要实例化的类
        scope:对象的作用域,默认是page,千万不要放到application中;
--%>
<jsp:useBean id="student" class="pojo.Student" scope="page"/>

<%--设置对象中的属性值--%>
<%
    student.setName("aaa");
    student.setAge(18);
    student.setId(001);
    student.setGraduate(true);
%>

<%--显示对象中的属性值·方法一--%>
<%=student.getName()%>
<%=student.getAge()%>
<%=student.getId()%>
<%=student.isGraduate()%>

<hr>

<%--显示对象中的属性值·方法二--%>
${student.name}
${student.age}
${student.id}
${student.graduate}

</body>
</html>      

jsp:setProperty和jsp:getProperty标签测试

项目中一个实体类:Student类,通过pojo.jsp获取该类的对象,并且设置和显示对象中的属性值,代码如下:

  • Student.java
public class Student {

    // 面向对象编程三大特性:封装、继承、多态
    // 封装:属性私有,不让用户随意操作,于是我们设置操作属性的公开方法,我们会在公开的方法中定义安全性代码

    private String name;
    private int id;
    private int age;
    private boolean isGraduate; // 是否毕业

    public Student() {
    }

    public Student(String name, int id, int age, boolean isGraduate) {
        this.name = name;
        this.id = id;
        this.age = age;
        this.isGraduate = isGraduate;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getAge() {
        return age;
    }

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

    public boolean isGraduate() {
        return isGraduate;
    }

    public void setGraduate(boolean graduate) {
        isGraduate = graduate;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", id=" + id +
                ", age=" + age +
                ", isGraduate=" + isGraduate +
                '}';
    }
}      
  • pojo.jsp
<%@ page import="pojo.Student" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<%
    Student student = new Student();
%>

<%--jsp标签--%>
<%--setProperty默认使用的是实体类中的set方法--%>
<jsp:setProperty name="student" property="name" value="aaa"/>
<jsp:setProperty name="student" property="age" value="18"/>
<jsp:setProperty name="student" property="id" value="001"/>
<jsp:setProperty name="student" property="graduate" value="true"/>

<%--setProperty默认使用的是实体类中的get方法--%>
<jsp:getProperty name="student" property="age"/>
<jsp:getProperty name="student" property="name"/>
<jsp:getProperty name="student" property="id"/>

</body>
</html>      

JSTL标签库

作用

和jsp标签一样,为了解决jsp中嵌入java代码看着不舒服

注意点

  • 项目要导入对应的jstl标签库的jar包
  • Tomcat中也需要放置对应的jar包
  • 代码中,有些特殊符号需要使用转义字符
<%@ page import="com.kuang.pojo.Student" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%--
使用jstl或者其他标签库需要先导入,需要下载对应的jar包-jstl-1.2;
prefix:需要使用的标签库名
tagdir:标签库的本地目录
uri : 对应库的网络地址
--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html>
<head>
    <title>Title</title>
</head>
<body>


<%--
<c:out  输出
<c:out value="西部开源"/>
--%>
<c:out value="西部开源"/>

<%--
<c:if
    test: 需要判断的条件 ,等价于 if(exp)中的exp

if(){
}
--%>

<%
    request.getSession().setAttribute("name","qinjiang");
    Student student = new Student();
    student.setName("qinjiang");
%>

<%=student.getName().equals("qinjiang")%>
${sessionScope.name=='qinjiang'}

<c:if test="<%=student.getName().equals(\"qinjiang\")%>">
   <c:out value="admin"/>
</c:if>


</body>
</html>      

EL表达式

作用

简化jsp的代码难度

${表达式}
${page、session、request、Application的变量}      

过滤器

JavaWeb学习记录 Day5(JSP进阶)

主要用它来实现过滤乱码问题!

过滤器一般就用来过滤一些违规词语,解决乱码问题;主要还是为了解耦,职责统一

  1. 写一个类实现Filter接口,必定会重写三个方法
  • 初始化
  • doFilter(req,resp,doFilterChain)
  • doFilterChain(req,resp)
  • 注销
  1. 配置web.xml
<filter>
  <filter-name>myFilter</filter-name>
  <filter-class>com.kuang.filter.MyFilter</filter-class>
</filter>

<!--这里url代表需要过滤的请求路径
/*  所有的请求都会被过滤
/regist.do  只有这个请求会被过滤
过滤的注销和初始化时随着Tomcat容器一起启动或者关闭
-->

<filter-mapping>
  <filter-name>myFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>      
import javax.servlet.*;
import java.io.IOException;

//filter过滤实现
//1.实现Filter接口   : javax.servlet.Filter;
//2.配置web.xml
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("MyFilter初始化了");
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {
        //主要过滤方法编写在doFilter中
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");

        if (req.getParameter("username")!=null){
            System.out.println(req.getParameter("username"));
            if (req.getParameter("username").equals("aaa")){
                resp.getWriter().println("?????????????????????????????");
            }
        }

        System.out.println("执行方法filterChain.doFilter(req,resp);前===========");
        filterChain.doFilter(req,resp); //这行代码代表过滤器放行
        System.out.println("执行方法filterChain.doFilter(req,resp);后===========");
    }

    @Override
    public void destroy() {
        System.out.println("MyFilter注销了");
    }
}