8.JSP

JSP

笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html)

视频教程(P112~P122)

jsp逐渐被『freemarker』『Thymeleaf』『Velocity』取代,用法其实跟『JSP』差不太多

但还是可以了解一下,不需要深入去学习JSP的各种内容。至少别人说起JSP的时候,你能知道什么是JSP,能看懂JSP的代码就行了。

  • 概念: Java Server Pages,Java服务端页面

  • 一种动态的网页技术,其中既可以定义HTML、JS、CSS等静态内容,还可以定义Java代码的动态内容

  • JSP = HTML + Java

  • JSP的作用:简化开发,避免了在Servlet中直接输出HTML标签

JSP快速入门

  1. 导入JSP坐标

    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.2</version>
        <scope>provided</scope><!--因为tomcat自带了这个包-->
    </dependency>
    
  2. 创建JSP文件

  3. 编写HTML标签和Java代码

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <%System.out.println("hello world - jsp");%>
    </body>
    </html>
    

成功运行后在浏览器对应位置访问到页面,控制台会输出"hello world - jsp"

JSP原理

  • JSP本质上就是一个Servlet(原理如图)

    这个Servlet路径为 target\tomcat\work\Tomcat\localhost\login-web\org\apache\jsp\hello_jsp.java

    打开就能看出,它也是个 Servlet

JSP脚本

  • JSP脚本用于在JSP页面内定义Java代码

  • JSP脚本分类:

    1. <%...%>:内容会直接放到_jspService()方法之中

      (在服务器端执行的代码)

    2. <%=...%>:内容会放到out.print()中,作为out.print()的参数

      例:<%=i%> --> out.print(i);(会在网页输出内容)

      (out.write()和out.print()区别:前者只能输出字符或字符串,对于null,int这类的数据后者才支持)

    3. <%!...%>:内容会放到_jspService()方法之外,被类直接包含

      例:<%!void show(){} private String aaa;%>(会放到类中,成为成员变量或成员方法)

虽然可以在jsp文件中写java代码,但是不要直接在jsp中写代码,这样会导致可读性很差,对开发效率影响很大。

JSP缺点

  • 由于JSP页面内,既可以定义 HTML 标签,又可以定义Java代码,造成了以下问题:

    1. 书写麻烦:特别是复杂的页面
    2. 阅读麻烦
    3. 复杂度高:运行需要依赖于各种环境,JRE,JSP容器,JavaEE...
    4. 占内存和磁盘:JSP会自动生成.java和.class文件占磁盘,运行的是.class文件占内存
    5. 调试困难:出错后,需要找到自动生成的.java文件进行调试
    6. 不利于团队协作:前端人员不会Java,后端人员不精HTML
    7. ...
  • JSP已逐渐退出历史舞台 -->现在多用 HTML+AJAX 来替代

    graph LR A(Servlet) -->B(JSP)-->C(Servlet+JSP)-->D(Servlet+html+ajax)

使用JSP时不要直接在JSP文件中使用java代码,应该使用EL表达式和JSTL标签来替换其中的代码

EL表达式

  • Expression Language表达式语言,用于简化JSP页面内的Java代码

  • 主要功能:获取数据

    这里需要先利用 Request的请求转发 部分的知识,将数据放到request域中,再转发给jsp,jsp直接访问域中的数据

    request.setAttribute(String name, Object value);
    request.getRequestDispatcher("/jsp文件名").forward(request,response);
    
  • 语法: $

    ${name}获取域中存储的key为name的数据

  • JavaWeb中的四大域对象:

    1. page:当前页面有效
    2. request:当前请求有效
    3. session:当前会话有效
    4. application:当前应用有效

    EL表达式获取数据,会依次从这4个域中依次寻找,直到找到为止

JSTL标签

  • JSP标准标签库(Jsp Standarded Tag Library),使用标签取代JSP页面上的Java代码

    <c:if test="${flag ==1}">
    	男
    </c:if>
    <c:if test="${flag == 2}">
    	女
    </c:if>
    

JSTL快速入门

  1. 导入坐标

    <dependency>
        <groupId>jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
    <dependency>
        <groupId>taglibs</groupId>
        <artifactId>standard</artifactId>
        <version>1.1.2</version>
    </dependency>
    
  2. 在JSP页面上引入JSTL标签库

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    
  3. 使用(<c:if>标签)(注意:不存在类似else if的标签)

    <c:if test="true">
        <h1>true</h1>
    </c:if>
    <c:if test="false">
        <h1>false</h1>
    </c:if>
    

    实际情况一般是与EL标签配合使用

    request.setAttribute("status",1);
    request.getRequestDispatcher("/hello.jsp").forward(request,response);
    
    <c:if test="${status==1}">
        <h1>启用</h1>
    </c:if>
    <c:if test="${status==0}">
        <h1>禁用</h1>
    </c:if>
    

    在网页访问就能看到“启用”了(注意,不能直接访问jsp页面,要从自建的servlet进入)

  • <c:forEach> :相当于for循环

    • items:被遍历的容器
    • var:遍历产生的临时变量
    • varStatus:遍历状态对象(通常用于表格开头,用于计数,依次递增。1,2,3,4...或0,1,2,3,...)
    ArrayList<User> users = new ArrayList<>();
    users.add(new User(2,"张","123"));
    users.add(new User(4,"李","1234"));
    users.add(new User(5,"刘","1234"));
    request.setAttribute("users",users);
    request.getRequestDispatcher("/hello.jsp").forward(request,response);
    
    <table border="1">
        <tr align="center">
    		<td>序号</td><td>Id</td><td>姓名</td><td>密码</td>
        </tr>
        <c:forEach items="${users}" var="user" varStatus="status">
            <tr align="center">
                <td>${status.count}</td>
                <td>${user.id}</td>
                <td>${user.username}</td>
                <td>${user.password}</td>
            </tr>
        </c:forEach>
    </table>
    

    访问时会生成如下表格

    除了遍历也有普通的循环(用法类似,我就不举例了)

    • begin:开始数
    • end:结束数
    • step:步长

MVC模式和三层架构

MVC模式

  • MVC是一种分层开发的模式,其中:

    M:Model,业务模型,处理业务

    V:View,视图,界面展示

    C:Controller,控制器,处理请求,调用模型和视图

  • MVC好处

    职责单一,互不影响

    有利于分工协作

    有利于组件重用

三层架构

  • 数据访问层:对数据库的CRUD基本操作
  • 业务逻辑层:对业务逻辑进行封装,组合数据访问层层中基本功能,形成复杂的业务逻辑功能
  • 表现层:接收请求,封装数据,调用业务逻辑层,响应数据

MVC模式和三层架构对应关系

案例

完成品牌数据的增删改查操作

查询

  • 准备环境

    创建新的模块brand_demo,引入坐标

    创建三层架构的包结构

    数据库表tb_brand

    实体类 Brand

    MyBatis基础环境

    • Mybatis-config.xml
    • BrandMapper.xml
    • BrandMapper接口

自己先试着做,会做的部分写完了再参考我给的代码

项目文件结构

com/itwen/mapper/BrandMapper.java

package com.itwen.mapper;

import com.itwen.pojo.Brand;
import org.apache.ibatis.annotations.ResultMap;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface BrandMapper {

    /**
     * 查询所有
     * @return
     */
    @Select("select * from tb_brand")
    @ResultMap("brandResultMap")
    List<Brand> selectAll();
}

com/itwen/pojo/Brand.java

package com.itwen.pojo;


public class Brand {

    private Integer id;
    private String brandName;
    private String companyName;
    private Integer ordered;
    private String description;
    private Integer status;
    //get和set我就不加上了,浪费空间。记得加上(alt+ins)
}

com/itwen/service/BrandService.java

package com.itwen.service;

import com.itwen.mapper.BrandMapper;
import com.itwen.pojo.Brand;
import com.itwen.util.SqlSessionFactoryUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import java.util.List;

public class BrandService {
    SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();

    /**
     * 查询所有
     * @return
     */
    public List<Brand> selectAll(){
        //调用BrandMapper.selectAll()

        SqlSession sqlSession = sqlSessionFactory.openSession();
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);

        List<Brand> brands = mapper.selectAll();
        sqlSession.close();
        return brands;
    }
}

com/itwen/util/SqlSessionFactoryUtils.java

package com.itwen.util;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class SqlSessionFactoryUtils {
    private static SqlSessionFactory sqlSessionFactory;
    static {
        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static SqlSessionFactory getSqlSessionFactory() {
        return sqlSessionFactory;
    }
}

com/itwen/web/SelectAllServlet.java

package com.itwen.web;

import com.itwen.pojo.Brand;
import com.itwen.service.BrandService;

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.List;

@WebServlet("/SelectAllServlet")
public class SelectAllServlet extends HttpServlet {
    private BrandService service = new BrandService();

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.调用BrandService完成查询
        List<Brand> brands = service.selectAll();
        //2.存入request域中
        request.setAttribute("brands",brands);
        //3.转发到brand.jsp
        request.getRequestDispatcher("/brand.jsp").forward(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

BrandMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itwen.mapper.BrandMapper">
    <resultMap id="brandResultMap" type="brand">
        <result column="brand_name" property="brandName"></result>
        <result column="company_name" property="companyName"></result>
    </resultMap>
</mapper>

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--起别名-->
    <typeAliases>
        <package name="com.itwen.pojo"/>
    </typeAliases>

    <!--设置连接数据库的环境-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/db1"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <!--引入映射文件-->
    <mappers>
        <package name="com.itwen.mapper"/>
    </mappers>
</configuration>

brand.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</title>
</head>
<body>
<table border="1">
    <tr align="center">
        <td>序号</td>
        <td>品牌名称</td>
        <td>企业名称</td>
        <td>排序</td>
        <td>品牌介绍</td>
        <td>状态</td>
        <td>操作</td>
    </tr>
    <c:forEach items="${brands}" var="brand" varStatus="status">
        <tr align="center">
            <td>${status.count}</td>
            <td>${brand.brandName}</td>
            <td>${brand.companyName}</td>
            <td>${brand.ordered}</td>
            <td>${brand.description}</td>
            <c:if test="${brand.status==1}">
                <td>启用</td>
            </c:if>
            <c:if test="${brand.status==0}">
                <td>禁用</td>
            </c:if>
            <td><a href="#">修改</a> <a href="#">删除</a></td>
        </tr>
    </c:forEach>
</table>

</body>
</html>

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<a href="/brands-web/SelectAllServlet">查询所有</a>
</body>
</html>

添加

这部分就不给代码了,自己完成,还可以试着做修改和删除功能(不难)

posted @ 2023-01-09 09:05  文杰2000  阅读(19)  评论(0编辑  收藏  举报