MVC

学会重复、学会总结、学会预习和练习

前端页面  <---->   服务器(控制层、业务层、DAO层) <--->  DB

说明:无论是框架还是servletJSP,用的都是MVC思想,只不过框架用的是注解比如@autowire、@Resource来进行依赖注入以及

bean的装配,而servletJsp用的是多态,创建对象,并利用构造器传值并调用等;

比如登录
1.创建一个项目架构
src下
xx.controller servlet或者springmvc
xx.dao 接口
xx.daoImpl 连接DB的操作及sql或MyBatis
xx.entity 与数据库中的表以及前台表相对应的实体类的一个映射
xx.service 业务逻辑的,用于逻辑控制
xx.serviceImpl 具体的实现
xx.util DBUtils
lib jdbc驱动

webapp
index.jsp
login.jsp

2.准备jdbc驱动和配置文件

3.在entity包下建一个和表相关的实体类 User (因为要测试是否能登录成功,必须先有一个人这个类作为中间媒介)

4.前端页面login.jsp

<%--
Created by IntelliJ IDEA.
User: shijinglu
Date: 2019/2/24
Time: 10:42
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="login.do" type="post">
用户名:<input type="text" name="uname"><br>
密码:<input type="password" name="pwd"><br>
<input type="submit" value="登录">
<!--在登录页面显示错误信息-->
<% String str=(String)request.getAttribute("error");%>
out.println(str);
</form>
</body>
</html>

success.jsp

<%@ page import="sxt.entity.User" %><%--
Created by IntelliJ IDEA.
User: shijinglu
Date: 2019/2/24
Time: 14:49
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<script type="text/javascript">
function loginout() {
<!--跳转到退出的那个servlet-->
window.location.href="logout";
}
</script>
</head>
<body>
欢迎你<%=((User)session.getAttribute("user")).getUname()%>,登录成功<br>
<input type="button" value="退出" onclick="loginout()">
<a type="loginout">退出2</a>
<a href="javascript">退出3</a>
</body>
</html>

5.控制层

package sxt.controller;

import sxt.entity.User;
import sxt.service.UserService;
import sxt.serviceImpl.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 {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//1.设置编码
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//2.接收前台数据
String uname=req.getParameter("uname");
String pwd=req.getParameter("pwd");
//3.调用service层 在MySQL中,由于id自增,所以不需要id
User user=new User(uname,pwd);//说明:实体类中要加带两个参数的构造器
UserService us=new UserServiceImpl();//调用业务层的方法
us.findUser();
if(u!=null){
HttpSession session=req.getSession();
resp.sendRedirect(req.getContextPath()+"/success.jsp");
}else{
req.setAttribute("error","用户名或密码不对");
res.getRequestDispatcher("/login.jsp").forword(req,resp);
}
}
}

6.业务层:

package sxt.service;

public interface UserService {

    void findUser();
} package sxt.serviceImpl; import sxt.dao.UserDao;
import sxt.dao.UserDaoImpl;
import sxt.service.UserService; public class UserServiceImpl implements UserService { @Override
public void findUser() {
UserDao ud=new UserDaoImpl(); }
}

7.DAO层:连接数据的并进行相关操作的

package sxt.dao;

import sxt.entity.User;

public interface UserDao {
User selectOne(String uname, String pwd);
} package sxt.dao; import sxt.entity.User; import java.sql.Connection; public class UserDaoImpl implements UserDao{ @Override
public User selectOne(String uname, String pwd) {
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null; try{
//1.连接DB
conn=DBUtil.getConnection(conn,sql);
//2.把要准备预编译的sql操作准备好
String sql="select * from t_user where uname=? and id=?";
//3.获取PreparedStatement 预编译
ps=DBUtil.getPreparedStatement(conn,sql);
//4.给sql后面的参数赋值
String uname=ps.setString(1,uname);
String pwd=ps.setString(2,pwd);
//5.执行查询操作
rs=ps.executeQuery();
if(rs.next()){
//将返回的数据封装成一个对象
user=new User(rs.getInt("id"),rs.getString("uname"),rs.getPwd("pwd"));
}catch(SQLException e){
e.printStackTrace();
}finally{
DBUtil.closeAll(rs,ps,conn);
} return user;
}
}
}

---------------------------------------------------------------------------------------------

退出:消除session并回到登录页面

package sxt.controller;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; @WebServlet(name = "LoginOutServlet")
public class LoginOutServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//清除session
req.getSession().removeAttribute("user");
//重定向到登录页面
resp.sendRedirect(req.getContextPath()+"/login.jsp");
}
}

MVC设计思路的更多相关文章

  1. MVC3 数据验证用法之密码验证设计思路

    描述:MVC数据验证使用小结 内容:display,Required,stringLength,Remote,compare,RegularExpression 本人最近在公司用mvc做了一个修改密码 ...

  2. iOS 组件化 —— 路由设计思路分析

    原文 前言 随着用户的需求越来越多,对App的用户体验也变的要求越来越高.为了更好的应对各种需求,开发人员从软件工程的角度,将App架构由原来简单的MVC变成MVVM,VIPER等复杂架构.更换适合业 ...

  3. asp.net webform设计思路的思考

    我使用asp.net的webform框架进行web应用程序的开发已经差不多四年了,在整个开发生涯中,也使用过一年asp.net的mvc框架.因为网上经常有讨论webform框架和mvc框架的优劣,所以 ...

  4. Backbone设计思路和关键源码分析

    一. Backbone的江湖地位: backbone作为一个老牌js框架为大规模前端开发提供了新的开发思路:前端MVC模式,这个模式也是前端开发演变过程中的一个重要里程碑,也为MVVM和Redux等开 ...

  5. MVC设计之MVC设计模式(介绍)

    mvc介绍; 首先先引用一个百度百科的介绍: MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用 ...

  6. TYPESDK手游聚合SDK服务端设计思路与架构之一:应用场景分析

    TYPESDK 服务端设计思路与架构之一:应用场景分析 作为一个渠道SDK统一接入框架,TYPESDK从一开始,所面对的需求场景就是多款游戏,通过一个统一的SDK服务端,能够同时接入几十个甚至几百个各 ...

  7. 分享一个CQRS/ES架构中基于写文件的EventStore的设计思路

    最近打算用C#实现一个基于文件的EventStore. 什么是EventStore 关于什么是EventStore,如果还不清楚的朋友可以去了解下CQRS/Event Sourcing这种架构,我博客 ...

  8. ENode框架单台机器在处理Command时的设计思路

    设计目标 尽量快的处理命令和事件,保证吞吐量: 处理完一个命令后不需要等待命令产生的事件持久化完成就能处理下一个命令,从而保证领域内的业务逻辑处理不依赖于持久化IO,实现真正的in-memory: 保 ...

  9. WebGIS中快速整合管理多源矢量服务以及服务权限控制的一种设计思路

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在真实项目中,往往GIS服务数据源被其他多个信息中心或者第三方 ...

随机推荐

  1. 【CF613D】Kingdom and its Cities 虚树+树形DP

    [CF613D]Kingdom and its Cities 题意:给你一棵树,每次询问给出k个关键点,问做多干掉多少个非关键点才能使得所有关键点两两不连通. $n,\sum k\le 10^5$ 题 ...

  2. git 的相关知识

    参考文章 git checkout HEAD <file> :  master/HEAD -> index -> work directory index 暂存区有两行信息.分 ...

  3. FTPClient工具类

    package com.vcredit.ddcash.server.commons.net; import com.vcredit.ddcash.server.commons.model.FtpPar ...

  4. 关于maven的CoreException: Could not get the value for parameter compilerId for plugin 。。的错误

    在Eclipse中使用 Alt+F5 快捷键,在弹出的Update Maven Project对话框中选择报错的Maven工程,勾选下图中的 Force Update of Snapshots/Rel ...

  5. python全栈开发 * 14 知识点汇总 * 180530

    14 生成器表达式 内置函数# 一.迭代器 (补充)# 1.如何判断迭代对象,迭代器# (1).dir(obj)检测对象有没有iter方法,然后it=obj.__iter__() 获取迭代器 , it ...

  6. C++的一些知识

    1.C++中非虚函数都是静态绑定,虚函数是动态绑定.指针或引用访问对象的虚函数时才能进行动态绑定. 静态多态性:编译时确定操作的对象.如:函数重载,运算符重载. 动态多态性:运行时确定操作的对象. 绑 ...

  7. vue问题大全

    什么是 mvvm? MVVM 是 Model-View-ViewModel 的缩写.mvvm 是一种设计思想.Model 层代表数据模型,也可以在 Model 中定义数据修改和操作的业务逻辑:View ...

  8. Mycat了解下

    首先说下,因为本身不怎么推荐中间件,所以我对这东西也只是了解,业内mycat用的最好的应该顺风算一个,但是他们是做过二次开发的,咱菜鸡比不了,据说最近出来一个叫cetus的还不错,有空可以关注下 Ⅰ. ...

  9. nlp底层技术列举

    其实目前除了之前博客写到的一些关于自然语言处理用到的知识点之外,很多其他nlp技术只是会用但是不了解原理,先整体分个类,之后再仔细分析吧. 上图是https://www.sohu.com/a/1386 ...

  10. 高性能Nginx服务器-负载均衡

    Location正则表达式 location的作用 location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作. locatio ...