目录
JSP
MVC模式与三层架构
三层架构
综合案例
环境准备
查询所有
添加数据
修改数据
用户登录
记住用户
用户注册
验证码
java服务端页面,动态的网页技术
可以理解为jsp=html+java
jsp本质上就是一个servlet
But——————JSP有很多缺点
这里用了EL表达式(获取数据)与JSTL标签库(这里介绍的是foreach和if标签)替换JSP中的Java代码
M(Model)----业务模型---处理业务(例如查询数据库,封装数据)
V(View)----视图----页面展示
C(Controller)---控制器---处理请求,调用模型和视图
首先导入坐标——mybatis,servlet,mysql,jsp,jstl
然后导入插件tomcat
.xml配置如下(出错常见原因:版本问题,scope问题)
4.0.0
org.example
brand_demo
war
1.0-SNAPSHOT
brand_demo Maven Webapp
http://maven.apache.org
junit
junit
3.8.1
test
org.mybatis
mybatis
3.5.5
mysql
mysql-connector-java
5.1.46
javax.servlet
javax.servlet-api
3.1.0
provided
javax.servlet.jsp
jsp-api
2.2
provided
jstl
jstl
1.2
taglibs
standard
1.1.2
brand_demo
org.apache.tomcat.maven
tomcat7-maven-plugin
2.2
创建三层架构的包结构(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 selectAll(){
SqlSession sqlSession= factory.openSession();
BrandMapper mapper=sqlSession.getMapper(BrandMapper.class);
List 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 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" %>
Title
序号
品牌名称
企业名称
排序
品牌介绍
状态
操作
<%--${brand.id} --%>
${status.count}
${brand.brandName}
${brand.companyName}
${brand.ordered}
${brand.description}
启用
禁用
修改 删除
小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中
现在就实现了存入cookie。那么接下来,就是把cookie中存的数据回填
service层:
register.jsp中提交表单:
registerServlet中的内容:
引入了工具类
实现了验证码的自动生成,刷新,以及校验
小结