8.JSP
JSP
笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html)
jsp逐渐被『freemarker』『Thymeleaf』『Velocity』取代,用法其实跟『JSP』差不太多
但还是可以了解一下,不需要深入去学习JSP的各种内容。至少别人说起JSP的时候,你能知道什么是JSP,能看懂JSP的代码就行了。
-
概念: Java Server Pages,Java服务端页面
-
一种动态的网页技术,其中既可以定义HTML、JS、CSS等静态内容,还可以定义Java代码的动态内容
-
JSP = HTML + Java
-
JSP的作用:简化开发,避免了在Servlet中直接输出HTML标签
JSP快速入门
-
导入JSP坐标
<dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> <scope>provided</scope><!--因为tomcat自带了这个包--> </dependency>
-
创建JSP文件
-
编写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脚本分类:
-
<%...%>:内容会直接放到_jspService()方法之中
(在服务器端执行的代码)
-
<%=...%>:内容会放到out.print()中,作为out.print()的参数
例:<%=i%> --> out.print(i);(会在网页输出内容)
(out.write()和out.print()区别:前者只能输出字符或字符串,对于null,int这类的数据后者才支持)
-
<%!...%>:内容会放到_jspService()方法之外,被类直接包含
例:<%!void show(){} private String aaa;%>(会放到类中,成为成员变量或成员方法)
-
虽然可以在jsp文件中写java代码,但是不要直接在jsp中写代码,这样会导致可读性很差,对开发效率影响很大。
JSP缺点
-
由于JSP页面内,既可以定义 HTML 标签,又可以定义Java代码,造成了以下问题:
- 书写麻烦:特别是复杂的页面
- 阅读麻烦
- 复杂度高:运行需要依赖于各种环境,JRE,JSP容器,JavaEE...
- 占内存和磁盘:JSP会自动生成.java和.class文件占磁盘,运行的是.class文件占内存
- 调试困难:出错后,需要找到自动生成的.java文件进行调试
- 不利于团队协作:前端人员不会Java,后端人员不精HTML
- ...
-
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中的四大域对象:
- page:当前页面有效
- request:当前请求有效
- session:当前会话有效
- 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快速入门
-
导入坐标
<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>
-
在JSP页面上引入JSTL标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-
使用(<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>
添加
这部分就不给代码了,自己完成,还可以试着做修改和删除功能(不难)