潍坊手机网站制作,自己做的图片哪个网站可以出售,wordpress安装语言设置,学校门户网站建设目录 1.什么是三层架构
2.运用三层架构的目的
2.1规范代码
2.2解耦
2.3代码的复用和劳动成本的减少 3.各个层次的任务
3.1web层#xff08;表现层)
3.2service 层(业务逻辑层)
3.3dao 持久层(数据访问层)
4.结合mybatis简单实例演示 1.什么是三层架构
三层架构就是把…目录 1.什么是三层架构
2.运用三层架构的目的
2.1规范代码
2.2解耦
2.3代码的复用和劳动成本的减少 3.各个层次的任务
3.1web层表现层)
3.2service 层(业务逻辑层)
3.3dao 持久层(数据访问层)
4.结合mybatis简单实例演示 1.什么是三层架构
三层架构就是把整个软件系统分为三个层次
表现层Presentation layer业务逻辑层Business Logic Layer数据访问层Data access layer
三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为界面层User Interface layer、业务逻辑层Business Logic Layer、数据访问层Data access layer。区分层次的目的即为了“高内聚低耦合”的思想。在软件体系架构设计中分层式结构是最常见也是最重要的一种结构。微软推荐的分层式结构一般分为三层从下至上分别为数据访问层又称为持久层、业务逻辑层又或称为领域层、表示层。
2.运用三层架构的目的
2.1规范代码
大型软件需要团队配合的时候问题就来了由于每个程序员风格不一样而开发软件大量的代码风格不统一就会造成后期调试和维护出现问题然而软件分层后每个层合理分工这样的问题便迎刃而解
2.2解耦
上一层依赖于下一层如果测试下一层没有问题那么问题就只有可能发现在本层了便于发现和改正BUG。体现了“高内聚低耦合”的思想。比如楼房是分层的我们要到哪一层楼非常方便只需在电梯里按下那个楼层的层号即可。而三层架构就好比开发的软件“楼”哪层出现Bug哪层有问题我们作为开发人员能够随时找到并修正。 各个层次分工明确将一个复杂问题简单拆分了。 2.3代码的复用和劳动成本的减少 分层的根本在于代码的复用和劳动成本的减少。分层的最理想化的结果是实现层与层之间的互不依赖的内部实现所谓的即插即用
实现高内聚、低耦合。把问题划分开来各个解决易于控制易于延展易于分配资源。 3.各个层次的任务
3.1web层表现层)
表现层可以说是距离用户最近的层主要是用于接收用户输入的数据和显示处理后用户需要的数据。一般表现为界面用户通过界面输入查询数据和得到需要的数据。
com.by.servlet servlet包接受请求控制跳转页面
3.2service 层(业务逻辑层)
业务逻辑层是处于表现层和数据访问层之间主要是从数据库中得到数据然后对数据进行逻辑处理。
com.by.serviceService接口包
com.by.service.implService接口实现类处理业务
3.3dao 持久层(数据访问层)
数据访问层是直接和数据库打交道的对数据进行“增、删、改、查”等基本的操作。
com.by.daoDao接口包
com.by.dao.impl Dao接口实现类访问数据库
4.结合mybatis简单实例演示
具体目录如图所示 首先先建立User实体层
package com.by.pojo;public class User {private Integer id;private String username;private String password;private String sex;private String address;public Integer getId() {return id;}public void setId(Integer id) {this.id id;}public String getUsername() {return username;}public void setUsername(String username) {this.username username;}public String getPassword() {return password;}public void setPassword(String password) {this.password password;}public String getSex() {return sex;}public void setSex(String sex) {this.sex sex;}public String getAddress() {return address;}public void setAddress(String address) {this.address address;}
}再设置连接数据库db.properties
jdbc.drivercom.mysql.jdbc.Driver
#mysql8
#jdbc:mysql://127.0.0.1:3306/mybatis?useSSLfalseserverTimezoneAsia/Shanghai
jdbc.urljdbc:mysql://127.0.0.1:3305/servlet?characterEncodingUTF-8
jdbc.usernameroot
jdbc.password
mybatis-config.xml:
?xml version1.0 encodingUTF-8?
!DOCTYPE configuration PUBLIC -//mybatis.org//DTD Config 3.0//ENhttp://mybatis.org/dtd/mybatis-3-config.dtd
configurationproperties resourcedb.properties/propertiestypeAliases!--typeAlias typecom.by.pojo.User aliasUser/typeAlias--!--批量给pojo定义别名推荐使用小写--package namecom.by.pojo//typeAliases!--使用dev环境--environments defaultdevenvironment iddev!--事务--transactionManager typeJDBC/transactionManager!--typePOOLED连接池--dataSource typePOOLED!--mysql8--!--property namedriver valuecom.mysql.cj.jdbc.Driver/property nameurl valuejdbc:mysql://127.0.0.1:3306/mybatis?useSSLfalseamp;serverTimezoneAsia/Shanghai/--property namedriver value${jdbc.driver}/property nameurl value${jdbc.url}/property nameusername value${jdbc.username}/property namepassword value${jdbc.password}//dataSource/environment/environments!--加载mapper映射文件--mappers!--直接引入映射文件--!--mapper resourcecom/by/mapper/UserMapper.xml/mapper--!--按mapper接口的名称引入映射文件要求 mapper 接口名称和 mapper 映射文件名称相同--!--mapper classcom.by.mapper.UserMapper/mapper--!--批量按mapper接口的名称引入映射文件--package namecom.by.mapper//mappers
/configuration
设置公用代码MyServletContextListener
package com.by.listener;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.io.InputStream;//作用监听servletContext对象的创建和销毁
public class MyServletContextListener implements ServletContextListener {//servletContext对象创建后会调用此方法Overridepublic void contextInitialized(ServletContextEvent sce) {try {//加载mybatis的运行环境//加载mybatis-config.xmlString resource mybatis-config.xml;InputStream inputStream Resources.getResourceAsStream(resource);//创建sqlSessionFactorySqlSessionFactory sessionFactory new SqlSessionFactoryBuilder().build(inputStream);//创建sqlSessionSqlSession sqlSession sessionFactory.openSession();System.out.println(tomcat启动并加载mybatis环境 sqlSession);//把sqlSession对象撞到servletContext中ServletContext servletContext sce.getServletContext();servletContext.setAttribute(sqlSession, sqlSession);}catch (Exception e){e.printStackTrace();}}Overridepublic void contextDestroyed(ServletContextEvent sce) {}
}编写jsp代码
% page contentTypetext/html;charsetUTF-8 languagejava %
htmlheadtitle$Title$/title/headbodyh1用户管理系统/h1form actionlogin methodpost账号input typetext nameusernamebr密码input typetext namepasswordbrinput typesubmit value登录/form/body
/html
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitleTitle/title
/head
bodyh1人总得有个活着的理由。/h1
/body
/html
编写serviet的代码
package com.by.servlet;import com.by.pojo.User;
import com.by.service.UserService;
import com.by.service.impl.UserServiceImpl;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//表现层
public class LoginServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//根据input标签的name属性获取前端提交的参数String username req.getParameter(username);String password req.getParameter(password);//调用serviceUserService userService new UserServiceImpl(this);User user userService.login(username, password);if(user ! null){//如果登录成功则跳转到select_list.jspreq.getRequestDispatcher(select_list.jsp).forward(req, resp);}else{//如果登录失败则跳转到login.jspreq.getRequestDispatcher(login.jsp).forward(req, resp);}}
}实现service下的接口和实现类
UserService接口
package com.by.service;import com.by.pojo.User;public interface UserService {User login(String username, String password);
}UserServicelmpl.java:
package com.by.service.impl;import com.by.mapper.UserMapper;
import com.by.pojo.User;
import com.by.service.UserService;
import com.by.servlet.LoginServlet;
import org.apache.ibatis.session.SqlSession;import javax.servlet.ServletContext;//业务层
public class UserServiceImpl implements UserService {private UserMapper userMapper;public UserServiceImpl(LoginServlet loginServlet) {System.out.println(loginServlet);ServletContext servletContext loginServlet.getServletContext();SqlSession sqlSession (SqlSession) servletContext.getAttribute(sqlSession);userMapper sqlSession.getMapper(UserMapper.class);}Overridepublic User login(String username, String password) {//业务逻辑...//调用dao层return userMapper.login(username, password);}
}书写sql语句
UserMapper
public interface UserMapper {User login(Param(username) String username, Param(password) String password);
}UserMapper.xml:
?xml version1.0 encodingUTF-8?
!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.by.mapper.UserMapperselect idlogin resultTypecom.by.pojo.UserSELECT * FROM user WHERE username#{username} AND password#{password}/select
/mapper
wab.xml文件的配置
?xml version1.0 encodingUTF-8?
web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaeexmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsdversion4.0!--配置监听器--listenerlistener-classcom.by.listener.MyServletContextListener/listener-class/listenerservletservlet-namelogin/servlet-nameservlet-classcom.by.servlet.LoginServlet/servlet-class/servletservlet-mappingservlet-namelogin/servlet-nameurl-pattern/login/url-pattern/servlet-mappingwelcome-file-listwelcome-filelogin.jsp/welcome-file/welcome-file-list
/web-app 数据库 输入账号密码进行跳转