MVC架构 项目实践
2017-09-23 09:23
357 查看
MVC
MVC架构程序的工作流程
springmvc 中dao层和service层的区别
项目实践
项目目录
项目实现流程
JSP登录页面View层
LoginServletjavaController控制层
LoginServiceImpljava实现接口LoginService
UserDaojava
UserDaoImpjava继承自Oracle数据库连接池实现接口UserDao
JNDIBaseDaojava
BaseDaoJDBC交互数据库
其中,各自的功能为:
View视图:为用户提供使用界面,与用户直接进行交互。
Model模型:承载数据,并对用户提交请求进行计算的模块。其分为两类,一类称为数据承载Bean,一类称为业务处理Bean。所谓数据承载Bean是指实体类,专门承载业务数据的,如Student、User等。而业务处理Bean则是指Service或Dao对象,专门用于处理用户提交请求的。
Controller控制器:用于将yoghurt请求转发给相应的Model进行处理,并处理Model的计算结果向用户提供相应响应。
(2)服务端Controller控制器接收到请求后对请求进行解析,找到相应的Model对用户请求进行处理。
(3)Model处理后,将处理结果再交给Controller。
(4)Controller在接到处理结果后,根据处理结构找到要作为向客户端发回的View页面。页面经渲染(数据填充)后,再发送给客户端。
http://blog.csdn.net/dopamy_busymonkey/article/details/51422392
service是业务层,dao是数据访问层。
小白:在service里直接调用dao,service里面就new一个dao类对象,调用。
标准主流现在的编程方式都是采用MVC综合设计模式,MVC本身不属于设计模式的一种,它描述的是一种结构,最终目的达到解耦,解耦说的意思是你更改某一层代码,不会影响我其他层代码,如果你会像spring这样的框架,你会了解面向接口编程,表示层调用控制层,控制层调用业务层,业务层调用数据访问层。初期也许都是new对象去调用下一层,比如你在业务层new一个DAO类的对象,调用DAO类方法访问数据库,这样写是不对的,因为在业务层中是不应该含有具体对象,最多只能有引用,如果有具体对象存在,就耦合了。当那个对象不存在,我还要修改业务的代码,这不符合逻辑。好比主板上内存坏了,我换内存,没必要连主板一起换。我不用知道内存是哪家生产,不用知道多大容量,只要是内存都可以插上这个接口使用。这就是MVC的意义。
关于MVC与三层架构的解析学习参照之前转的博客:
http://blog.csdn.net/an1090239782/article/details/72804908
2:将用户名和密码通过form表单提交给Controller进行操作,调研Javabean将数据传至接口LoginServiceImpl中。
3:在LoginServiceImpl中,该类实现接口LoginDaoImpl中的login方法。并将数据传至UserDaoImpl接口。
4:在UserDaoImpl接口实现对数据的相关操作,根据数据结果进行相关判断及使用。其中UserDaoImpl实现接口UserDao。
5:UserDao接口定义查询方法,查询数据库中是否存在该用户。
Login.jsp——>LoginServelet—–>LoginServiceImpl—–>UserDao—–>UserDaoImp。
在登录页面填写用户名和密码,通过form表单提交请求给Login.action。
通过注解配置LoginServlet.java。
LoginServlet.java实现代码:
实现代码:
实现代码:
实现代码:
至此,一个完整的MVC开发流程描述完毕,具体相关代码及操作,如有疑问可留言讨论,新手小白学习,还望大佬们赐教。如有雷同,纯属巧合。
MVC架构程序的工作流程
springmvc 中dao层和service层的区别
项目实践
项目目录
项目实现流程
JSP登录页面View层
LoginServletjavaController控制层
LoginServiceImpljava实现接口LoginService
UserDaojava
UserDaoImpjava继承自Oracle数据库连接池实现接口UserDao
JNDIBaseDaojava
BaseDaoJDBC交互数据库
MVC
MVC指:Model模型、View视图、Controller控件器。其中,各自的功能为:
View视图:为用户提供使用界面,与用户直接进行交互。
Model模型:承载数据,并对用户提交请求进行计算的模块。其分为两类,一类称为数据承载Bean,一类称为业务处理Bean。所谓数据承载Bean是指实体类,专门承载业务数据的,如Student、User等。而业务处理Bean则是指Service或Dao对象,专门用于处理用户提交请求的。
Controller控制器:用于将yoghurt请求转发给相应的Model进行处理,并处理Model的计算结果向用户提供相应响应。
MVC架构程序的工作流程:
(1)用户通过View页面向服务器端提出请求,可以是表单请求、超链接请求、AJAX请求等。(2)服务端Controller控制器接收到请求后对请求进行解析,找到相应的Model对用户请求进行处理。
(3)Model处理后,将处理结果再交给Controller。
(4)Controller在接到处理结果后,根据处理结构找到要作为向客户端发回的View页面。页面经渲染(数据填充)后,再发送给客户端。
springmvc 中dao层和service层的区别
这个知识点转载自:http://blog.csdn.net/dopamy_busymonkey/article/details/51422392
service是业务层,dao是数据访问层。
小白:在service里直接调用dao,service里面就new一个dao类对象,调用。
标准主流现在的编程方式都是采用MVC综合设计模式,MVC本身不属于设计模式的一种,它描述的是一种结构,最终目的达到解耦,解耦说的意思是你更改某一层代码,不会影响我其他层代码,如果你会像spring这样的框架,你会了解面向接口编程,表示层调用控制层,控制层调用业务层,业务层调用数据访问层。初期也许都是new对象去调用下一层,比如你在业务层new一个DAO类的对象,调用DAO类方法访问数据库,这样写是不对的,因为在业务层中是不应该含有具体对象,最多只能有引用,如果有具体对象存在,就耦合了。当那个对象不存在,我还要修改业务的代码,这不符合逻辑。好比主板上内存坏了,我换内存,没必要连主板一起换。我不用知道内存是哪家生产,不用知道多大容量,只要是内存都可以插上这个接口使用。这就是MVC的意义。
关于MVC与三层架构的解析学习参照之前转的博客:
http://blog.csdn.net/an1090239782/article/details/72804908
项目实践
以下就是实战,利用MVC设计模式场景,实现一个小的登录功能。项目目录:
项目实现流程:
1:首先进入登录页面,输入用户名和密码。2:将用户名和密码通过form表单提交给Controller进行操作,调研Javabean将数据传至接口LoginServiceImpl中。
3:在LoginServiceImpl中,该类实现接口LoginDaoImpl中的login方法。并将数据传至UserDaoImpl接口。
4:在UserDaoImpl接口实现对数据的相关操作,根据数据结果进行相关判断及使用。其中UserDaoImpl实现接口UserDao。
5:UserDao接口定义查询方法,查询数据库中是否存在该用户。
Login.jsp——>LoginServelet—–>LoginServiceImpl—–>UserDao—–>UserDaoImp。
JSP登录页面(View层)
JSP登录页面:在登录页面填写用户名和密码,通过form表单提交请求给Login.action。
<body> <form action="login.action"> 用户名:<input type="text" name="uname" value="${param.uname }"><br/> 密码:<input type="password" name="pwd" value="${param.pwd }"><br/> <input type="submit" value="登录"><br/> <span style="color: red;">${requestScope.error }</span> </form> <a href="register.jsp">没有账号,立即注册</a> </body>
LoginServlet.java(Controller控制层)
通过登录页面将数据传至LoginServlet,java。通过注解配置LoginServlet.java。
@WebServlet(value="/login.action")
LoginServlet.java实现代码:
@WebServlet(value="/login.action") public class LoginServlet extends HttpServlet { private LoginService service; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String uname=request.getParameter("uname"); String pwd=request.getParameter("pwd"); //调用javabean service=new LoginServiceImpl(); User user=service.login(uname, pwd); //跳转jsp if(user!=null) { request.getSession().setAttribute("user", user); response.sendRedirect("welcome.jsp"); } else { request.setAttribute("error", "登录失败请重新输入"); request.getRequestDispatcher("login.jsp").forward(request, response); } } }
LoginServiceImpl.java(实现接口LoginService)
LoginServiceImpl.java实现代码:public class LoginServiceImpl implements LoginService { private UserDao dao=new UserDaoImpl(); @Override public User login(String uname, String pwd) { // TODO Auto-generated method stub //业务处理 User user=new User(uname,pwd); return dao.findUser(user); } }
UserDao.java
接口UserDao,java中实现关于用户的数据访问的相关方法。实现代码:
public interface UserDao { //查询 User findUser(User user); //删除 }
UserDaoImp.java(继承自Oracle数据库连接池,实现接口UserDao)
UserDaoImpl,java继承了JNDIBaseDao,实现从数据库中查找是否存在该数据,实现方法为UserDao中的查询方法。public class UserDaoImpl extends JNDIBaseDao implements UserDao
实现代码:
public class UserDaoImpl extends JNDIBaseDao implements UserDao { @Override public User findUser(User user) { // TODO Auto-generated method stub //3.执行sql语句 //4.获取结果集 String sql = "select * from user where 1=1"; ArrayList list = new ArrayList(); if(user.getUname()!=null&&!user.getUname().equals("")){ sql+=" and uname=? "; list.add(user.getUname()); } ResultSet rs=executeQuery(sql, list.toArray()); //访问数据库查询是否存在该用户 try { //登录成功 if(rs.next()) { //把结果集转换成实体类 user.setUname(rs.getString("uname")); user.setPwd(rs.getString("pwd")); user.setId(rs.getInt("id")); user.setSex(rs.getString("sex")); user.setEmail(rs.getString("email")); return user; } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } //不存在该用户 return null; } }
JNDIBaseDao.java
在JNDIBaseDao中,通过连接池方法实现与Oracle数据库的交互,并实现对数据库之中的相关操作,如增删改查等。实现代码:
public class JNDIBaseDao { private DataSource source; private Connection connection; private PreparedStatement ps; private ResultSet rs; { try { Context ic = new InitialContext(); source = (DataSource)ic.lookup("java:comp/env/jdbc/test"); } catch (NamingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void getConnection() { try { connection=source.getConnection(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 增删改操作 * @param sql * @param objs * @return 影响行数 */ public int executeUpdate(String sql,Object... objs) { if(connection==null) { getConnection(); } int res=-1; try { //设置手动提交事务 connection.setAutoCommit(false); connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); ps=connection.prepareStatement(sql); if(objs!=null) { for(int i=0;i<objs.length;i++) { ps.setObject(i+1, objs[i]); } } res=ps.executeUpdate(); //手动提交事务 connection.commit(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); try { connection.rollback(); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } finally { if(ps!=null) { try { ps.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return res; } /** * 查询操作 * @param sql * @param objs * @return */ public ResultSet executeQuery(String sql,Object... objs) { if(connection==null) { getConnection(); } try { ps=connection.prepareStatement(sql); if(objs!=null) { for(int i=0;i<objs.length;i++) { ps.setObject(i+1, objs[i]); } } rs=ps.executeQuery(); return rs; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } public void closeAll() { try { if(rs!=null) { rs.close(); } if(ps!=null) { ps.close(); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
BaseDao(JDBC交互数据库)
JDBC方式连接数据库与数据库实现相关交互操作。public class BaseDao { private String driver="oracle.jdbc.driver.OracleDriver"; private String url="jdbc:oracle:thin:@localhost:1521:jredu"; private String username="test"; private String password="Jredu12345"; private Connection connection; private PreparedStatement ps; private ResultSet rs; public void getConnection() { try { Class.forName(driver); connection=DriverManager.getConnection(url,username,password); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 增删改操作 * @param sql * @param objs * @return 影响行数 */ public int executeUpdate(String sql,Object... objs) { if(connection==null) { getConnection(); } try { ps=connection.prepareStatement(sql); if(objs!=null) { for(int i=0;i<objs.length;i++) { ps.setObject(i+1, objs[i]); } } return ps.executeUpdate(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { closeStatement(); } return 0; } /** * 查询操作 * @param sql * @param objs * @return */ public ResultSet executeQuery(String sql,Object... objs) { if(connection==null) { getConnection(); } try { ps=connection.prepareStatement(sql); if(objs!=null) { for(int i=0;i<objs.length;i++) { ps.setObject(i+1, objs[i]); } } rs=ps.executeQuery(); return rs; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } /** * 关闭声明 */ public void closeStatement() { try { if (ps != null) { ps.close(); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 把结果集和声明同时关闭 */ public void closeAll() { try { if(rs!=null) { rs.close(); } if(ps!=null) { ps.close(); } if(connection!=null) { connection.close(); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
至此,一个完整的MVC开发流程描述完毕,具体相关代码及操作,如有疑问可留言讨论,新手小白学习,还望大佬们赐教。如有雷同,纯属巧合。
相关文章推荐
- MVC项目实践,在三层架构下实现SportsStore-05,实现导航
- MVC项目实践,在三层架构下实现SportsStore-03,Ninject控制器工厂等
- MVC项目实践,在三层架构下实现SportsStore-04,实现分页
- MVC项目实践,在三层架构下实现SportsStore-08,部署到IIS服务器
- MVC项目实践,在三层架构下实现SportsStore-09,ASP.NET MVC调用ASP.NET Web API的查询服务
- MVC项目实践,在三层架构下实现SportsStore,从类图看三层架构
- MVC项目实践,在三层架构下实现SportsStore-10,连接字符串的加密和解密
- MVC项目实践,在三层架构下实现SportsStore-02,DbSession层、BLL层
- MVC项目实践,在三层架构下实现SportsStore-07,实现订单提交
- MVC项目实践,在三层架构下实现SportsStore-11,使用Knockout实现增删改查
- MVC项目实践,在三层架构下实现SportsStore-01,EF Code First建模、DAL层等
- MVC项目实践,在三层架构下实现SportsStore-06,实现购物车
- MVC项目实践,在三层架构下实现SportsStore-03,Ninject控制器工厂等
- MVC项目实践,在三层架构下实现SportsStore-01,EF Code First建模、DAL层等
- Servlet+oracle MVC 架构 搭建简易购物车web项目---数据库设计
- MVC架构Maven项目(五)Spring集成
- 分布式架构真正适用于大型互联网项目的架构! dubbo+zookeeper+springmvc+mybatis+shiro+redis
- MVC架构(一)构建JSP+Servlet+JDBC结构的web项目
- EF+MVC+Bootstrap 项目实践 Day2
- .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整(续)-使用配置文件动态注入