概念: Java Server Pages,Java服务端页面
一种动态的网页技术,其中既可以定义HTML、JS、CSS等静态内容,还可以定义Java代码的动态内容
JSP = HTML + Java
JSP的作用:简化开发,避免了在Servlet中直接输出HTML标
1,JSP脚本
1.1 导入JSP坐标
<!--jsp-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
1.2 创建JSP文件
1.3 编写HTML标签和java代码
<body>
<h1>JSP,Hello World</h1>
<%
System.out.println("hello,jsp~~");
%>
</body>
2,JSP原理
概念: Java Server Pages,Java服务端页面
JSP = HTML + Java,用于简化开发的
JSP本质上就是一个Servlet
JSP在被访问时,由JSP容器(Tomcat)将其转换为Java文件(Servlet),在由JSP容器(Tomcat)将其编译,最终对外提供服务的其实就是这个字节码文件
3,JSP脚本
JSP脚本用于在JSP页面内定义Java代码
JSP脚本分类:
1,<%...%>:内容会直接放到_jspService()方法之中
<%
System.out.println("hello,jsp~~");
int i=3;
%>
2,<%=...%>:内容会放到out.print()中,作为out.print()的参数
<%="hello"%>
<%=i%>
3,<%!...%>:内容会放到_jspService()方法之外,被类直接包含
<%!
void show(){}
String name="zhangsan";
%>
3.1 案例
要求,使用jsp生成如下表格
<%
//查询数据库
List<Brand> brands = new ArrayList<Brand>();
brands.add(new Brand(1,"三只松鼠","三只松鼠",100,"三只松鼠,好吃不上火",1));
brands.add(new Brand(2,"优衣库","优衣库",200,"优衣库,服适人生",0));
brands.add(new Brand(3,"小米","小米科技有限公司",1000,"为发烧而生",1));
%>
<%
for (int i=0;i<brands.size();i++){
Brand brand = brands.get(i);
%>
<tr align="center">
<td><%=brand.getId()%></td>
<td><%=brand.getBrandName()%></td>
<td><%=brand.getCompanyName()%></td>
<td><%=brand.getOrdered()%></td>
<td><%=brand.getDescription()%>,好吃不上火</td>
<%
if (brand.getStatus() == 1){
//显示启用
%>
<td><%="启用"%></td>
<% }else{
//显示禁用
%>
<td><%="禁用"%></td>
<%
}
%>
<td><a href="#">修改</a> <a href="#">删除</a></td>
</tr>
<%
}
%>
4,JSP缺点
由于JSP页面内,既可以定义HTML标签,又可以定义Java代码,造成了以下问题:
1.书写麻烦:特别是复杂的页面
2.阅读麻烦
3.复杂度高:运行需要依赖于各种环境,JRE,JSP容器,JavaEE...
4.占内存和磁盘:JSP会自动生成,java和.class文件占磁盘,运行的是.class文件占内存
5.调试困难:出错后,需要找到自动生成的.java文件进行调试
6.不利于团队协作:前端人员不会Java,后端人员不精HTML
7. .
5,EL表达式
Expression Language表达式语言,用于简化JSP页面内的Java代码
主要功能:获取数据
语法: ${expression}
${brands}∶获取域中存储的key为brands的数据
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.准备数据
List<Brand> brands = new ArrayList<Brand>();
brands.add(new Brand(1,"三只松鼠","三只松鼠",100,"三只松鼠,好吃不上火",1));
brands.add(new Brand(2,"优衣库","优衣库",200,"优衣库,服适人生",0));
brands.add(new Brand(3,"小米","小米科技有限公司",1000,"为发烧而生",1));
//2.存储到request域中
req.setAttribute("brands",brands);
//3.转发到el-demo.jsp
req.getRequestDispatcher("/el-demo.jsp").forward(req,resp);
}
<body>
${brands}//${brands}∶获取域中存储的key为brands的数据
</body>
利用el表达式,可以简化代码
JavaWeb中的四大域对象:
1. page:当前页面有效
2. request:当前请求有效
3. session:当前会话有效
4. application:当前应用有效
el表达式获取数据,会依次从这4个域中寻找,直到找到为止
6,JSTL标签
JSP标准标签库(Jsp Standarded Tag Library),使用标签取代JSP页面上的Java代码
6.1 JSTL快速入门
6.1.1 导入坐标
<!--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>
6.1.2 在JSP页面上引入JSTL标签库
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
6.1.3 使用
<%--
c:if: 用来进行逻辑判断,替换java中的 if else
--%>
<c:if test="true">
<h1>true</h1>
</c:if>
<c:if test="false">
<h1>false</h1>
</c:if>
6.2 <c:if>标签
//因为status传入的数据为1,故当${status}判断为真的情况下会输出
//如下,会输出 启用
<c:if test="${status == 1}">
启用
</c:if>
<c:if test="${status == 0}">
禁用
</c:if>
req.setAttribute("status",1);
6.3 <c:forEach>
6.3.1 forEach类
<c:forEach>:相当于for循环
items:被遍历的容器
var:遍历产生的临时变量
varStatus:遍历状态对象
//${brands}为items,brand为var
<c:forEach items="${brands}" var="brand">
<tr align="center">
<td>${brand.id}</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 != 1}">
<td>禁用</td>
</c:if>
<td><a href="#">修改</a> <a href="#">删除</a></td>
</tr>
</c:forEach>
varStatus:可以替代原来的<td>${brand.id}</td>,便于修改id,不会出现0 1 3的情况
其中status.index代表从0开始
status.count代表从1开始
<c:forEach items="${brands}" var="brand" varStatus="status">
//<td>${brand.id}</td>
<td>${status.index}</td>//status.index代表从0开始
<td>${status.count}</td>//status.count代表从1开始
6.3.2 普通for循环类
<c:forEach begin="0" end="10" step="1" var="i">
${i}
</c:forEach>
<c:forEach begin="0" end="10" step="1" var="i">
${i}<br>
</c:forEach>
7,MVC模式和三层架构
7.1 MVC模式
MVC是一种分层开发的模式,其中:
M: Model,业务模型,处理业务
V: View,视图,界面展示
C: Controller,控制器,处理请求,调用模型和视图
MVC好处:
职责单一,互不影响
有利于分工协作
有利于组件重用
7.2 三层架构
数据访问层:对数据库的CRUD基本操作
业务逻辑层:对业务逻辑进行封装,组合数据访问层层中基本功能,形成复杂的业务逻辑功能
表现层:接收请求,封装数据,调用业务逻辑层,响应数据
8,案例
8.1 查询所有
selectAllServlet:
private BrandService service = new BrandService();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.调用BrandService完成查询
List<Brand> brands = service.selectAll();
//2.存入request中
req.setAttribute("brand",brands);
//3.转入brand.jsp中
req.getRequestDispatcher("/brand.jsp").forward(req,resp);
}
BrandService:
public class BrandService {
SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();
//查询所有
public List<Brand> selectAll(){
//调用BrandMapper的selectAll方法
//2.获取SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//3.获取BrandMapper
BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
//4.调用方法
List<Brand> brands = mapper.selectAll();
//5.释放资源
sqlSession.close();
return brands;
}
//添加
public void add(Brand brand){
//2.获取SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//3.获取BrandMapper
BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
//4.调用方法
mapper.add(brand);
//提交事务
sqlSession.commit();
//5.释放资源
sqlSession.close();
}
//修改
public Brand selectById(int id){
//2.获取SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//3.获取BrandMapper
BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
//4.调用方法
Brand brand = mapper.selectById(id);
//5.释放资源
sqlSession.close();
return brand;
}
//修改
public void update(Brand brand){
//2.获取SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//3.获取BrandMapper
BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
//4.调用方法
mapper.update(brand);
//提交事务
sqlSession.commit();
//5.释放资源
sqlSession.close();
}
}
SqlSessionFactoryUtils:
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;
}
}
updateService:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//处理post乱码的请求问题
req.setCharacterEncoding("utf-8");
//1.处理提交表单的数据,封装为另一个Brand对象
String id=req.getParameter("id");
String brandName = req.getParameter("brandName");
String companyName = req.getParameter("companyName");
String ordered = req.getParameter("ordered");
String description = req.getParameter("description");
String status = req.getParameter("status");
//封装为新对象
Brand brand = new Brand();
brand.setId(Integer.parseInt(id));
brand.setBrandName(brandName);
brand.setCompanyName(companyName);
brand.setOrdered(Integer.parseInt(ordered));
brand.setDescription(description);
brand.setStatus(Integer.parseInt(status));
//调用service,完成修改
service.update(brand);
//3.转发查询所有
req.getRequestDispatcher("/selectAllServlet").forward(req,resp);
}