MVC设计思路
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设计思路的更多相关文章
- MVC3 数据验证用法之密码验证设计思路
描述:MVC数据验证使用小结 内容:display,Required,stringLength,Remote,compare,RegularExpression 本人最近在公司用mvc做了一个修改密码 ...
- iOS 组件化 —— 路由设计思路分析
原文 前言 随着用户的需求越来越多,对App的用户体验也变的要求越来越高.为了更好的应对各种需求,开发人员从软件工程的角度,将App架构由原来简单的MVC变成MVVM,VIPER等复杂架构.更换适合业 ...
- asp.net webform设计思路的思考
我使用asp.net的webform框架进行web应用程序的开发已经差不多四年了,在整个开发生涯中,也使用过一年asp.net的mvc框架.因为网上经常有讨论webform框架和mvc框架的优劣,所以 ...
- Backbone设计思路和关键源码分析
一. Backbone的江湖地位: backbone作为一个老牌js框架为大规模前端开发提供了新的开发思路:前端MVC模式,这个模式也是前端开发演变过程中的一个重要里程碑,也为MVVM和Redux等开 ...
- MVC设计之MVC设计模式(介绍)
mvc介绍; 首先先引用一个百度百科的介绍: MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用 ...
- TYPESDK手游聚合SDK服务端设计思路与架构之一:应用场景分析
TYPESDK 服务端设计思路与架构之一:应用场景分析 作为一个渠道SDK统一接入框架,TYPESDK从一开始,所面对的需求场景就是多款游戏,通过一个统一的SDK服务端,能够同时接入几十个甚至几百个各 ...
- 分享一个CQRS/ES架构中基于写文件的EventStore的设计思路
最近打算用C#实现一个基于文件的EventStore. 什么是EventStore 关于什么是EventStore,如果还不清楚的朋友可以去了解下CQRS/Event Sourcing这种架构,我博客 ...
- ENode框架单台机器在处理Command时的设计思路
设计目标 尽量快的处理命令和事件,保证吞吐量: 处理完一个命令后不需要等待命令产生的事件持久化完成就能处理下一个命令,从而保证领域内的业务逻辑处理不依赖于持久化IO,实现真正的in-memory: 保 ...
- WebGIS中快速整合管理多源矢量服务以及服务权限控制的一种设计思路
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在真实项目中,往往GIS服务数据源被其他多个信息中心或者第三方 ...
随机推荐
- maridb 10.3 主从复制,待机情况下从库 cpu 占用率高的处理方法
发现两台从库,一直都在CPU 占用率 60% 90% 中浮动, 但是写库却很正常.搜了一大把没找到答案,把参数测试了一下得出以下结论 slave my.cnf 添加如下参数 #只读模式 read_o ...
- socket详解(二)----实例和多线程,线程池使用
一般而言,Java 语言中的套接字有以下两种形式: TCP 套接字(由 Socket 类实现,) UDP 套接字(由 DatagramSocket 类实现) TCP 和 UDP 扮演相同角色,但做法不 ...
- Python yield 函数功能
python中有一个非常有用的语法叫做生成器,所利用到的关键字就是yield.有效利用生成器这个工具可以有效地节约系统资源,避免不必要的内存占用. 一段代码 def test_dict_sort(): ...
- docker学习(一)
在工作和生活中免不了要学习新的东西.学习新东西要和已有的东西相结合,要有较快的效率.今天学习一下docker的使用,也锻炼一下自己学习新东西的能力. 1.学习docker,首先要下载docker.首先 ...
- js中 给json对象添加属性和json数组添加元素
js中 给json对象添加新的属性 比如现在有一个json对象为jsonObj,需要给这个对象添加新的属性newParam,同时给newParam赋值为pre.做法如下: var obj={ &quo ...
- @staticmethod和classmethod
之前一直搞不清楚这两个类方法有什么区别,今天着重学习了一下 @staticmethod是静态方法,不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样. class C(object): ...
- 转载http协议
转载自:https://blog.csdn.net/weixin_38051694/article/details/77777010 1.说一下什么是Http协议 对器客户端和 服务器端之间数据传输的 ...
- 通过ICE轻松部署WES7镜像
作者:雷志刚 转自:http://lzg-ad.blog.sohu.com/156323256.html 注:该文转自Happymy,感谢他的技术提供和分享. 本文适合的软件版本:CTP,RC 如果大 ...
- C和C指针小记(十四)-字符串、字符和字节
1.字符串 C语言没有字符串数据类型,因为字符串以字符串常量的形式出现或存储于字符数组中. 字符串常量和适用于那些程序不会对他们进行修改的字符串. 所有其他字符串都必须存储于字符串数组或动态分配的内存 ...
- Java Web请求和响应机制
1.请求响应流程图 =================== 服务器处理请求的流程: 服务器每次收到请求时,都会为这个请求开辟一个新的线程. 服务器会把客户端的请求数据封装到request对象中,req ...