目录
JSP
java服务端页面,动态的网页技术
可以理解为jsp=html+java
jsp本质上就是一个servlet
But——————JSP有很多缺点
这里用了EL表达式(获取数据)与JSTL标签库(这里介绍的是foreach和if标签)替换JSP中的Java代码
- EL表达式
- ${expression}——${brands} 就是获取域中存储的 key 为 brands 的数据
- 定义servlet,把数据封装到request域中并转发到相应的.jsp页面
- 在那个.jsp文件中即可通过${key}的形式获得数据
- JSTL(要在.jsp页面引入核心标签库)
-
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
MVC模式与三层架构
-
M(Model)----业务模型---处理业务(例如查询数据库,封装数据)
V(View)----视图----页面展示
C(Controller)---控制器---处理请求,调用模型和视图
三层架构
综合案例
环境准备
首先导入坐标——mybatis,servlet,mysql,jsp,jstl
然后导入插件tomcat
.xml配置如下(出错常见原因:版本问题,scope问题)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>brand_demo</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>brand_demo Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<!--mybatis-->
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<!--servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--jsp-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
<!--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>
</dependencies>
<build>
<finalName>brand_demo</finalName>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
</plugins>
</build>
</project>
创建三层架构的包结构(pojo是实体类,util是工具类)
创建数据库表,创建实体类brand(放在pojo下)
接下来配置mybatis基础环境 (注意是new Directory,用/而不是.)
(包含核心配置文件,sql映射文件,同名Mapper接口放在mapper包下)
注意的点:
核心配置文件中改成连接的数据库信息
查询所有
逻辑:
Dao层:
Mapper接口(这里简单,就用注解开发了)
SqlSessionFactory工具类
package com.itheima.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;
}
}
Service层:调用mapper接口中的selectAll方法,返回查询到的List
public class BrandService {
SqlSessionFactory factory=SqlSessionFactoryUtils.getSqlSessionFactory();
public List<Brand> selectAll(){
SqlSession sqlSession= factory.openSession();
BrandMapper mapper=sqlSession.getMapper(BrandMapper.class);
List<Brand> brands=mapper.selectAll();
sqlSession.close();
return brands;
}
}
Web层:
(服务器会去找index.jsp资源)
超链接至servlet界面
那么,在web包下创建servlet
@WebServlet("/selectAllServlet")
public class selectAllServlet extends HttpServlet {
private BrandService service=new BrandService(); //获取一个BrandService对象
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*调用BrandService完成查询*/
List<Brand> brands=service.selectAll(); //调用selectAll方法(底层是mapper接口)
/*存入request域中,key为brands*/
request.setAttribute("brands",brands);
/*转发到brand.jsp*/
request.getRequestDispatcher("/brand.jsp").forward(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
最终的brand.jsp内容如下(用了jstl)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page isELIgnored="false" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<input type="button" value="新增" id="add"><br>
<hr>
<table border="1" cellspacing="0" width="80%">
<tr>
<th>序号</th>
<th>品牌名称</th>
<th>企业名称</th>
<th>排序</th>
<th>品牌介绍</th>
<th>状态</th>
<th>操作</th>
</tr>
<c:forEach items="${brands}" var="brand" varStatus="status">
<tr align="center">
<%--<td>${brand.id}</td>--%>
<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 != 1}">
<td>禁用</td>
</c:if>
<td><a href="/brand_demo/selectByIdServlet?id=${brand.id}">修改</a> <a href="#">删除</a></td>
</tr>
</c:forEach>
</table>
<script>
document.getElementById("add").onclick = function (){
location.href = "/brand-demo/addBrand.jsp";
}
</script>
</body>
</html>
小tip:resultMap的应用,来解决数据库中名字和属性名不同
添加数据
逻辑:
Mapper接口:
在service文件中调用mapper,写一个add函数
public void add(Brand brand){
SqlSession sqlSession= factory.openSession();
BrandMapper mapper=sqlSession.getMapper(BrandMapper.class);
mapper.add(brand);
//要提交事务
sqlSession.commit();
sqlSession.close();
}
创建相应的servlet(第一行那个是乱码处理)
用request的相应接口获取表单提交的数据,封装,然后调用service层中的add添加到数据库中,接着跳转到查询所有的servlet界面。像上一节一样把数据查询并显示出来
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
//接收表单提交的数据,封装
String brandName=request.getParameter("brandName");
String companyName=request.getParameter("companyName");
String ordered=request.getParameter("ordered");
String description=request.getParameter("description");
String status=request.getParameter("status");
Brand brand=new Brand();
brand.setBrandName(brandName);
brand.setCompanyName(companyName);
brand.setOrdered(Integer.valueOf(ordered));
brand.setDescription(description);
brand.setStatus(Integer.valueOf(status));
//调用service完成添加
service.add(brand);
//转发到查询所有的servlet
request.getRequestDispatcher("selectAllServlet").forward(request,response);
}
那么在哪里点击新增?又如何通过提交表单来添加数据?
在brand.jsp中添加一个按钮,再给它绑定事件
在addBrand.jsp中:
在这里就可以提交到servlet界面,然后去封装并且执行添加sql啦
修改数据
修改分为回显数据和修改数据
逻辑
同样,写Dao
写service
public Brand selectById(int id){
SqlSession sqlSession= factory.openSession();
BrandMapper mapper=sqlSession.getMapper(BrandMapper.class);
Brand brand=mapper.selectById(id);
sqlSession.close();
return brand;
}
修改界面
写对应的servlet
@WebServlet("/selectByIdServlet")
public class SelectByIdServlet extends HttpServlet {
private BrandService service=new BrandService(); //获取一个BrandService对象
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//接收id
String id=request.getParameter("id");
//调用service查询
Brand brand=service.selectById(Integer.parseInt(id));
//存储到request中
request.setAttribute("brand",brand);
//转发到Update.jsp
request.getRequestDispatcher("/update.jsp").forward(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
写回显数据的jsp update.jsp
********************************真正的修改*******************************************
定义Mapper接口
定义service
update.jsp
updateServlet
(和AddServlet比起来,多了一个id)
@WebServlet("/updateServlet")
public class UpdateServlet extends HttpServlet {
private BrandService service=new BrandService();
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
//接收表单提交的数据,封装
String id=request.getParameter("id");
String brandName=request.getParameter("brandName");
String companyName=request.getParameter("companyName");
String ordered=request.getParameter("ordered");
String description=request.getParameter("description");
String status=request.getParameter("status");
Brand brand=new Brand();
brand.setId(Integer.valueOf(id));
brand.setBrandName(brandName);
brand.setCompanyName(companyName);
brand.setOrdered(Integer.valueOf(ordered));
brand.setDescription(description);
brand.setStatus(Integer.valueOf(status));
//调用service完成添加
service.update(brand);
//转发到查询所有的servlet
request.getRequestDispatcher("selectAllServlet").forward(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
小结
*******************以下功能加上了session和cookie***********************
用户登录
同样是先编写Dao层
这次操作的表不再是tb_brand而是tb_user了,因此我们新建一个UserMapper,同时还有UserMapper.xml文件,还有User实体类
service层:
同样是获取session,调用mapper里的方法
web层
在login.jsp中,表单会提交到LoginServlet
loginServlet中做的事情:
获取用户输入的用户名和密码,然后传参,调用service中的login方法
看看是否登录成功(也就是能否找到user)
若成功,把user的信息存到session 里,然后重定向到selectAllServlet
若不成功,重新跳转到login.jsp
登录失败的那句话会写在login.jsp的这里
若登录成功,则会在brand.jsp里动态显示用户名(为啥能显示?因为被存在session 中了)
记住用户
在刚刚的loginServlet中加入写cookie的逻辑
login.jsp中
LoginServlet中
现在就实现了存入cookie。那么接下来,就是把cookie中存的数据回填
用户注册
service层:
register.jsp中提交表单:
registerServlet中的内容:
验证码
引入了工具类
实现了验证码的自动生成,刷新,以及校验
小结