javaWeb中MVC的编程思想示例
没有学习MVC之前我只写了一个Servlet类(Note_List.java),分层之后,我将这个类分成了5个类(NoteDao.java,,NoteDaoImpl.java,,NoteService.java,,NoteServiceImpl.java,,Note_List.java),MVC的基础知识我就不在此赘述,这里只是写一个MVC分层思想的示例,便于了解这种编程思想。
分层之前的Note_List.java
public class Note_List extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
DBHelp db = new DBHelp();
String sql = "select * from note";
List<Map<String, String>> lmap = new ArrayList<Map<String, String>>();
lmap = db.query(sql, null);
List<Note> list = new ArrayList<Note>();
if (lmap.size() > 0) {
for (Map<String, String> map : lmap) {
Note note = new Note();
note.setTitle(map.get("title"));
note.setTags(map.get("tags"));
note.setAuthor(map.get("author"));
note.setContent(map.get("content"));
note.setCreatetime(map.get("createtime"));
list.add(note);
}
List<String> imgSrc = new ArrayList<String>();// 提取每个文档内容中的图片地址集合
List<String> imgSrcFirst = new ArrayList<String>();// 提取每个文档内容中的第一个图片地址
List<String> contentTxt = new ArrayList<String>();// 提取每个文档内容中的纯文本内容的前101字节
for (int i = 0; i < lmap.size(); i++) {
String ct = lmap.get(i).get("content");
if (ct == null || ct.equals("")) {// 判断文档内容是否为空或者为空串
contentTxt.add(null);
imgSrcFirst.add(null);
} else {
String ctTxt = Get_ContentTxt_FormHTML.getContentTxt(ct);
if (ctTxt == null) {
contentTxt.add(null);
} else {
int l = ctTxt.getBytes().length;
if (l <= 100) {// 字符串不等于NULL,字节数肯定大于0
contentTxt.add(ctTxt);
} else {
contentTxt.add(ctTxt.substring(0, 100) + "...");
}
contentTxt.add(null);
}
imgSrc = Get_Image_FormHTML.getImageSrc(ct);
if (imgSrc.size() == 0) {
imgSrcFirst.add(null);
} else {
imgSrcFirst.add(imgSrc.get(0));
}
}
}
HttpSession sesImg = req.getSession();
sesImg.setAttribute("img", imgSrcFirst);
HttpSession sesConTxt = req.getSession();
sesConTxt.setAttribute("txt", contentTxt);
req.setAttribute("list", list);
req.getRequestDispatcher("note_list_user.jsp").forward(req, resp);
}
}
}
可见,没有分层的代码杂乱无章,复杂难懂,所以应该把项目分层:
分层后的5个类:(按顺序阅读)
第1个类:NoteDao.java 接口:
public interface NoteDao {
public List<NoteBean> queryAll();// 查询所有文档所有字段内容
public List<String>contentAll();//提取所有文档中content字段内容
public List<List<String>>contentImg();// 提取所有文档内容中的每一个文档的图片地址集合
public List<String>contentImgFirst();// 提取每一个文档内容中的图片地址集合中第一个图片地址的集合
public List<String>contentTxt(); //提取每个文档内容中纯文本内容
public List<String>contentTxtHundred();//提取每个文档内容中纯文本内容的前101字节
}
第2个类:NoteDaoImpl.java 实现类:
public class NoteDaoImpl implements NoteDao {
DBUtil db = new DBUtil();
// 查询所有文档所有字段内容
@Override
public List<NoteBean> queryAll() {
String sql = "select * from note";
List<Map<String, String>> lmap = new ArrayList<Map<String, String>>();
lmap = db.query(sql, null);
List<NoteBean> list = new ArrayList<NoteBean>();
for (Map<String, String> map : lmap) {
NoteBean nb = new NoteBean();
nb.setAuthor(map.get("author"));
nb.setContent(map.get("content"));
nb.setCreatetime(map.get("createtime"));
nb.setId(Integer.parseInt(map.get("id")));
nb.setTags(map.get("tags"));
nb.setTitle(map.get("title"));
list.add(nb);
}
return list;
}
// 提取所有文档中content字段内容
@Override
public List<String> contentAll() {
NoteDao nd = new NoteDaoImpl();
List<NoteBean> lnb = nd.queryAll();
List<String> content = new ArrayList<String>();
if (lnb!=null&&lnb.size() > 0) {
for (int i = 0; i < lnb.size(); i++) {
content.add(lnb.get(i).getContent());
}
}
return content;
}
// 提取所有文档内容中的每一个文档的图片地址集合
@Override
public List<List<String>> contentImg() {
NoteDao nd = new NoteDaoImpl();
List<String> lnb = nd.contentAll();
List<List<String>> imgSrc = new ArrayList<List<String>>();
if (lnb!=null&&lnb.size() > 0) {// 判断所有文档总内容的集合是否为null
for (int i = 0; i < lnb.size(); i++) {
String ct = lnb.get(i);
if (ct == null || ct.equals("")) {// 判断每一个文档的内容是否为空
imgSrc.add(null);
} else {
imgSrc.add(Get_ContentImg_FormHTML.getImageSrc(ct));//此处调用了公共类
}
}
}
return imgSrc;
}
// 提取每一个文档内容中的图片地址集合中第一个图片地址的集合
@Override
public List<String> contentImgFirst() {
NoteDao nd = new NoteDaoImpl();
List<List<String>> lnb = nd.contentImg();
List<String> imgSrcFirst = new ArrayList<String>();
if (lnb!=null&&lnb.size() > 0) {// 判断所有文档图片地址集合是否为空
for (int i = 0; i < lnb.size(); i++) {
if (lnb.get(i)!=null&&lnb.get(i).size() > 0) {// 判断每一个文档中图片地址集合是否为空
imgSrcFirst.add(lnb.get(i).get(0));// 提取每一个文档中的图片地址集合中第一个图片
} else {
imgSrcFirst.add(null);
}
}
}
return imgSrcFirst;
}
// 提取每个文档内容中纯文本内容
@Override
public List<String> contentTxt() {
NoteDao nd = new NoteDaoImpl();
List<String> lnb = nd.contentAll();
List<String> ctTxt = new ArrayList<String>();// 提取每个文档内容中的纯文本内容
if (lnb!=null&&lnb.size() > 0) {// 判断所有文档内容的集合是否为空
for (int i = 0; i < lnb.size(); i++) {
String ctText = Get_ContentTxt_FormHTML.getContentTxt(lnb.get(i));//此处调用了公共类
if (ctText == null || ctText.equals("")) {// 判断每一个文档的内容是否为空
ctTxt.add(null);
} else {
ctTxt.add(ctText);
}
}
}
return ctTxt;
}
// 提取每个文档内容中纯文本内容的前101字节
@Override
public List<String> contentTxtHundred() {
NoteDao nd = new NoteDaoImpl();
List<String> ctTxt = nd.contentTxt();
List<String> ctTxtHundred = nd.contentTxt();
if (ctTxt!=null&&ctTxt.size() > 0) {// 判断所有文档的纯内容的集合是否为空
for (int i = 0; i < ctTxt.size(); i++) {
if (ctTxt.get(i) == null || ctTxt.get(i).equals("")) {// 判断每一个文档的内容是否为空
ctTxtHundred.add(null);
} else {
int l = ctTxt.get(i).getBytes().length;
if (l <= 100) {// 字符串不等于NULL,字节数肯定大于0,判断总字节数是否大于100
ctTxtHundred.add(ctTxt.get(i));
} else {
ctTxtHundred.add(ctTxt.get(i).substring(0, 100) + "...");
}
}
}
}
return ctTxtHundred;
}
}
第3个类:NoteService.java 接口:
public interface NoteService {
public List<NoteBean> queryAll();// 查询所有文档所有字段内容
public List<String>contentAll();//提取所有文档中content字段内容
public List<List<String>>contentImg();// 提取所有文档内容中的每一个文档的图片地址集合
public List<String>contentImgFirst();// 提取每一个文档内容中的图片地址集合中第一个图片地址的集合
public List<String>contentTxt(); //提取每个文档内容中纯文本内容
public List<String>contentTxtHundred();//提取每个文档内容中纯文本内容的前101字节
}
第4个类:NoteServiceImpl.java 实现类:
public class NoteServiceImpl implements NoteService{
NoteDao nd=new NoteDaoImpl();
@Override
public List<NoteBean> queryAll() {
List<NoteBean> nb=nd.queryAll();
return nb;
}
@Override
public List<String> contentAll() {
List<String> ls=nd.contentAll();
return ls;
}
@Override
public List<List<String>> contentImg() {
List<List<String>>lts=nd.contentImg();
return lts;
}
@Override
public List<String> contentImgFirst() {
List<String>ls=nd.contentImgFirst();
return ls;
}
@Override
public List<String> contentTxt() {
List<String>ls=nd.contentTxt();
return ls;
}
@Override
public List<String> contentTxtHundred() {
List<String>ls=nd.contentTxtHundred();
return ls;
}
}
第5个类:Note_List.java (Servlet类)
public class Note_List extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
NoteService nd = new NoteServiceImpl();
List<NoteBean> lnb = nd.queryAll();// 查询所有文档所有字段内容
List<String> imgSrcFirst = nd.contentImgFirst();// 提取每个文档内容中的第一个图片地址的集合
List<String> ctTxtHundred = nd.contentTxtHundred();// 提取每个文档内容中的纯文本内容的前101字节
HttpSession sesImg = req.getSession();
sesImg.setAttribute("img", imgSrcFirst);
HttpSession sesConTxt = req.getSession();
sesConTxt.setAttribute("txt", ctTxtHundred);
req.setAttribute("list", lnb);
req.getRequestDispatcher("note_list_user.jsp").forward(req, resp);
}
}
可见,分层后的代码,简明易懂,易于维护和代码复用,但是代码量增加了不少,对于程序的运行效率我觉得会有一定程度的损失。
javaWeb中MVC的编程思想示例的更多相关文章
- PHP中MVC的编程思想浅谈
我相信这样的文章已经被写烂了,但是我今天还是愿意冒着风险把自己的经验与大家分享一下.纯属原创,我也没什么可保留,希望对新手有帮助,有说的什么不对的地方,欢迎大家伙吐槽. 什么是MVC? 简单的说就是将 ...
- JDK 7中的函数式编程思想[转载]
原文作者的观点是Lambda表达式一定会包含在JDK 7中,而全文也着重介绍了这方面的知识,作者认为函数式编程的概念也将出现在JDK 7中. Lambda表达式 Lambda表达式并不是什么新概念,自 ...
- JavaWeb中MVC的使用--以管理系统举例
开发环境:JavaSE1.7.JavaEE7.0.JSTL1.2.2.Web2.3.MySQL5.5.28 系统分析与功能设计: 本系统实现商品信息的管理,应包括以下几个功能: 商品信息列表:列出所有 ...
- JavaWeb中过滤器Filter的使用示例
https://github.com/YouXianMing/Java-Web-Study/tree/master/Servlet-Filter 过滤器示例基于以下流程 测试效果如下 web.xml配 ...
- 怎样删除C/C++代码中的所有注释?浅谈状态机的编程思想
K&R习题1-23中,要求“编写一个程序,删除C语言程序中所有的注释语句.要正确处理带引号的字符串与字符常量.在C语言中,注释不允许嵌套”. 如果不考虑字符常量和字符串常量,问题确实很简单.只 ...
- JavaWeb之Servlet、拦截器、监听器及编程思想
本文包含的内容有: Servlet的理解 自定义Servlet.监听器和过滤器 三者的一点点编程设计思想 后续的学习 JavaWeb是Web开发的重要基础,对Servlet.监听器和过滤器等知识的掌握 ...
- java编程思想第四版中net.mindview.util包下载,及源码简单导入使用
在java编程思想第四版中需要使用net.mindview.util包,大家可以直接到http://www.mindviewinc.com/TIJ4/CodeInstructions.html 去下载 ...
- Java中的泛型 --- Java 编程思想
前言 我一直都认为泛型是程序语言设计中一个非常基础,重要的概念,Java 中的泛型到底是怎么样的,为什么会有泛型,泛型怎么发展出来的.通透理解泛型是学好基础里面中非常重要的.于是,我对<Ja ...
- Java编程思想中关于闭包的一个例子
Java编程思想中的一个例子,不是很理解使用闭包的必要性,如果不使用闭包,是不是有些任务就不能完成?继续探索. package InnerClass; interface Incrementable ...
随机推荐
- python标准库之operator(运算符模块)
operator模块提供了一系列与Python自带操作一样有效的函数.例如:operator.add(x, y)和表达式x+y是等效的.那些特殊类的方法都有自己的函数名:为了方便起见,一些函数名是没有 ...
- Linux 使用nmcli配置网络
Linux 使用nmcli配置网络 前提: 在虚拟机中添加一张桥接模式的网卡,如果是VirtualBox虚拟机中要shutdown才能添加. 1.启动NetworkManager工具,安装nmcli命 ...
- 项目总结21:项目总结21:input实现多图上传(FormData)(上传OSS并保存数据库)
项目总结21:input实现多图上传(FormData)(上传OSS并保存数据库) 备注:本案例,作为Demo,包含少量的项目业务逻辑,input多图上传的逻辑是完整的: 不废话直接上代码 1-前端标 ...
- linux尝试登录失败后锁定用户账户的两种方法
linux尝试登录失败后锁定用户账户的两种方法 更新时间:2017年06月23日 08:44:31 作者:Carey 我要评论 这篇文章主要给大家分享了linux尝试登录失败后锁定用户账 ...
- 如何解决出现AXIOS的跨域问题:Request header field Content-Type is not allowed by Access-Control-Allow-Headers in preflight response.
转载:https://www.cnblogs.com/caimuqing/p/6733405.html 问题描述: 由于restful接口需要在头部header传递两个字段: Content-Type ...
- 关于TCP窗口大小
窗口字段 TCP Window字段用于接收端通知发送端:接收端当前能够接收的字节数(即当前允许发送端发送的字节数).在TCP Header中占有16bit长度,如下所示 0 1 2 3 0 1 2 3 ...
- 基础汇编指令(16bit 32bit 64bit)
(zz from http://blog.luoyuanhang.com/) ##常见寄存器 寄存器 16位 32位 64位 累加寄存器 accumulator AX EAX RAX 基址寄存器 ba ...
- 201771010134杨其菊《面向对象程序设计(java)》第十六周学习总结
第十六周学习总结 第一部分:理论知识 1. 程序是一段静态的代码,它是应用程序执行的蓝本.进程是程序的一次动态执行,它对应了从代码加载.执行至执行完毕的一个完整过程.操作系统为每个进程分配一段独立的内 ...
- git 一些实用的api
v3 获取原始文件内容: curl -H "PRIVATE-TOKEN: <token>" -H "Content-Type: application/jso ...
- Vb6调用C#生成的dll
namespace ClassLibrary1 { [ClassInterface(ClassInterfaceType.AutoDispatch)] //注意这行,这行是关键 pub ...