㈠ mvc璁捐℃ā寮忔槸浠涔(mvc妯″纺鏄浠涔堟剰镐)
濡备綍鐞呜Вmvc璁捐℃ā寮忥纻
杩欎釜闂棰樻垜浠ュ墠甯浜哄洖绛旇繃锛岀幇鍦ㄧ粰浣犲洖澶崭竴涓嬨
妯″瀷鏄鎸囨暟鎹妯″瀷銆
瑙嗗浘鏄鎸嘦I瑙嗗浘
鍙﹀栵纴鎺у埗鏄鎸囨带鍒躲
涓轰粈涔堣佺敤MVC锛熺洰鍓嶆渶濂戒娇鐢∕VC妯″纺璁捐℃墍链夋湁UI鐣岄溃镄勭▼搴忋
瑙嗗浘锛氭垜浠闇瑕佹湁涓涓鐗规畩镄勬ā鍧楋纴涔熷瓨鍌ㄦ墍链夌殑UI缁勪欢搴掳纴鎸夐挳锛屽浘鐗囷纴鏂囨湰妗嗭纴鍒楄〃锛岃彍鍗旷瓑銆傝繖浜涗笢瑗块兘鏄姝荤殑锛屾病链夊唴瀹广傛瘆濡备竴涓鏂囨湰妗嗭纴濡傛灉浣犳妸瀹冧粠缁勫簱涓𨰾垮嚭𨱒ワ纴榛樿ら噷闱㈡槸娌℃湁鏂囧瓧镄勚
妯″瀷锛氭垜浠镄勬暟鎹妯″瀷锛屽傛灉鏄闱㈠悜瀵硅薄镄勭▼搴忥纴灏辨槸鏁版嵁绫汇傛瘆濡傚︾敓锛岃佸笀锛岃溅锛屽伐浣滀汉锻樼瓑绛夈傚畠浠涔熷彲浠ョ悊瑙d负鏁版嵁缁撴瀯銆傛垜浠蹇呴’链変竴涓鐗规畩镄勬ā鍧楁潵瀛桦偍杩欎簺缁撴瀯銆傜粨鏋勪篃姝讳简銆傚傛灉涓嶆妸浠栨嬁鍑烘潵浣跨敤锛屼粬灏嗘案杩滆汉鍦ㄦā鍧楅噷銆
Control:Controller锛屽彲浠ョ悊瑙d负涓娈典唬镰侊纴瀹冧细镙规嵁褰揿墠镄勭▼搴忕姸镐佹満锛岀敤阃傚綋镄勬暟鎹妯″瀷涓镄勬暟鎹濉鍏匲I瑙嗗浘銆傛垨钥咃纴阃氲繃鐩戣哢I缁勪欢镄勬洿鏀癸纴鍙浠ュ皢涓浜涙洿鏀瑰啓锲炲埌鏁版嵁妯″瀷涓銆
鐢ㄦ埛娉ㄥ唽鐣岄溃锛
链夊洓涓猆I缁勪欢1銆傛枃链妗嗘彁绀虹敤鎴疯緭鍏ヤ竴浜涙敞鍐屼俊鎭2銆备袱涓杈揿叆鏂囨湰妗嗗厑璁哥敤鎴疯緭鍏ヤ粬浠镄勫笎鍙峰拰瀵嗙爜3銆备竴涓鎸夐挳銆
杩欓噷锛屾ā鍨嬫槸鐢ㄦ埛閰岖疆鏂囦欢銆
瑙嗗浘鏄锲涗釜UI缁勪欢銆
鎺у埗闇瑕佺▼搴忓姞浠g爜锛
褰撴寜阍琚鎸変笅镞讹纴棣栧厛鐢熸垚鐢ㄦ埛镄勫疄渚嬨傚疄闄呬笂锛屽瓧绗︿覆鏄鍒嗗埆浠庝袱涓杈揿叆妗嗕腑銮峰彇镄勶纴骞跺垎閰崭简鐢ㄦ埛镄刬d鍜屽瘑镰併备缭瀛樼敤鎴峰疄渚嬫垨灏嗗叾鍙戦佸埌链嶅姟鍣ㄣ
鍦ㄨ繖涓杩囩▼涓锛屼笁涓妯″潡钖勫徃鍏惰亴锛屽敖鍙鑳藉皯镄勪簰涓嶅共镓般傚挨鍏舵槸妯″瀷鍜岃嗗浘涔嬮棿娌℃湁骞叉𡒄锛岃屾带浠舵槸妗ユ併
浠ヤ笂鏄瀵筳ava镄凪VC妯″纺镄勫ぇ姒傝В閲娿
java涓璏VC镄剋eb搴旂敤涔熸湁镫涔夌殑瑙i喷锛屽氨鏄叠/S涓甯哥敤镄凪VC鏋舵瀯锛屽叿浣揿彲浠ユ煡璇㈣繖涓淇℃伅銆傚畠鏄鍑犱釜鑻辨枃棣栧瓧姣岖殑缂╁啓Model锛寁iew锛孋ontrollermodel锛孷iew鍜宑ontrolcontroller銆备粠鑻辫涓涓嶉毦鐪嫔嚭锛孧浠h〃浼佷笟鏁版嵁鍜屼笟锷¤勫垯銆倂鏄鐢ㄦ埛鐪嫔埌骞朵笌涔嬩氦浜掔殑鐣岄溃銆傛带鍒跺櫒鎺ュ弹鐢ㄦ埛镄勮緭鍏ワ纴骞惰皟鐢ㄦā鍨嫔拰瑙嗗浘𨱒ユ弧瓒崇敤鎴风殑瑕佹眰銆傝繖绉嶆ā寮忕殑鐗圭偣鏄鍒嗗伐鏄庣‘锛屼娇绋嫔簭锻树笓娉ㄤ簬涓氩姟阃昏緫锛岀晫闱㈢▼搴忓憳涓撴敞浜庤〃鐜般傚悓镞讹纴涔熸柟渚夸简杞浠跺伐绋嬬殑绠$悊銆
浠涔堟槸MVC妯″纺锛
MVC鏄钬樻ā鍨-瑙嗗浘-鎺у埗鍣ㄢ欑殑缂╁啓锛屼腑鏂囩炕璇戣繃𨱒ュ氨鏄钬樻ā寮-瑙嗗浘-鎺у埗鍣ㄢ欍侻VC搴旂敤绋嫔簭镐绘槸鐢辫繖涓夐儴鍒嗙粍鎴愩备簨浠跺艰嚧鎺у埗鍣ㄦ洿鏀规ā鍨嫔拰/鎴栬嗗浘銆傚彧瑕佹带鍒跺櫒鏀瑰彉浜嗘ā鍨嬬殑鏁版嵁鎴栧睘镐э纴镓链夌殑渚濊禆瑙嗗浘閮戒细镊锷ㄦ洿鏂般傜被浼煎湴锛屾疮褰撴带鍒跺櫒鏀瑰彉瑙嗗浘镞讹纴瑙嗗浘灏嗕粠娼滃湪镄勬ā鍨嬩腑銮峰彇鏁版嵁𨱒ュ埛鏂拌嚜宸便侻VC妯″纺链镞╃敱smalltalk璇瑷镰旂┒缁勬彁鍑猴纴搴旂敤浜庣敤鎴蜂氦浜掑簲鐢ㄣ俿malltalk璇瑷鍜宩ava璇瑷链夊緢澶氱浉浼间箣澶勶纴閮芥槸闱㈠悜瀵硅薄镄勮瑷銆傝嚜铹讹纴SUN鍦╬etstore妗堜緥搴旂敤涓鎺ㄨ崘MVC妯″纺浣滀负寮鍙慦eb搴旂敤镄勬灦鏋勬ā寮忋侻VC妯″纺鏄涓绉嶆灦鏋勬ā寮忥纴浣嗗疄闄呬笂闇瑕佸叾浠栨ā寮忕殑閰嶅悎銆傚湪J2EE妯″纺鐩褰曚腑锛岄氩父閲囩敤闱㈠悜宸ヤ汉镄勬湇锷℃ā寮忥纴闱㈠悜宸ヤ汉镄勬湇锷℃ā寮忓彲浠ョ敱闆嗕腑鎺у埗鍣ㄦā寮忋佽皟搴﹀櫒妯″纺鍜岄〉闱㈠姪镓嬫ā寮忕粍鎴愩係truts鍙瀹炵幇MVC镄勮嗗浘鍜屾带鍒跺櫒閮ㄥ垎锛屾ā鍨嬮儴鍒嗛渶瑕佸紑鍙戣呰嚜宸卞疄鐜般係truts鎻愪緵浜嗘娊璞$殑绫绘搷浣滐纴杩欐牱寮鍙戜汉锻桦氨鍙浠ュ皢妯″瀷搴旂敤鍒癝truts妗嗘灦涓銆
MVC妯″纺鏄涓绉嶅嶆潅镄勬灦鏋勬ā寮忥纴鍏跺疄鐜颁篃闱炲父澶嶆潅銆备絾鏄鎴戜滑镐荤粨浜嗗緢澶氩彲闱犵殑璁捐℃ā寮忥纴钖勭嶈捐℃ā寮忕殑缁勫悎浣垮缑MVC妯″纺镄勫疄鐜扮浉瀵圭亩鍗曞规槗銆傝嗗浘鍙浠ョ湅浣滀竴妫垫爲锛屾樉铹跺彲浠ョ敤澶嶅悎妯″纺𨱒ュ疄鐜般傝嗗浘鍜屾ā鍨嬩箣闂寸殑鍏崇郴鍙浠ラ氲繃瑙傚疗钥呮ā寮忔潵浣撶幇銆傛带鍒舵带鍒跺櫒瑙嗗浘镄勬樉绀哄彲浠ラ氲繃绛栫暐妯″纺𨱒ュ疄鐜般傛ā鍨嬮氩父鏄涓涓涓浠嬶纴鍙浠ラ氲繃涓浠嬫ā寮忔潵瀹炵幇銆
㈡ 求个websocket和springmvc结合的例子啊,网上找的都不靠谱
最近一段时间因为需要,要做一个网页游戏。在某一段时间需要页面实时刷新。目前做网站普遍的思路都是js轮询的方式。由于是创新式的小项目,同组的好友提议了html5中提到的WebSocket,首先进行了技术调研。目前java方面支持的WebSocket的不算多。网上能搜到关于websocket实现框架的非常少。java EE7中加入WebSocket还没有看到。所以以来的包都来自于tomcat的支持。至少需要3个包tomcat-coyote,tomcat-catalina,tomcat-annotations-api,因为tomcat从7.027版本才开始比较好的支持websocket,在tomcat7.027之前的版本中,已经能使用websocket,但是会出现各式各样的问题。比如websocket连接后静置几秒钟就断开连接了等等。所以比较好的选择是使用7.027以上的版本。这3个jar包在相应tomcat的lib文件夹下都有。自从研究生期间接触maven后,慢慢了解到maven的强大,在这里不得不感叹一下。因为是个小型的敏捷团队,版本控制是必须的。在jar包控制这方面还是想通过maven来控制。就直接去maven中心库搜了搜。果真还是有的。小组讨论之后决定使用tomcat7.039(貌似40已经出了),到此解决了版本控制和jar包配置问题。pom关于tomcat3个jar包如下:
1 <dependency> 2 <groupId>org.apache.tomcat</groupId> 3 <artifactId>tomcat-coyote</artifactId> 4 <version>7.0.39</version> 5 </dependency> 6 <dependency> 7 <groupId>org.apache.tomcat</groupId> 8 <artifactId>tomcat-catalina</artifactId> 9 <version>7.0.39</version>10 </dependency>11 <dependency>12 <groupId>org.apache.tomcat</groupId>13 <artifactId>tomcat-annotations-api</artifactId>14 <version>7.0.39</version>15 </dependency>
接下来是解决架构问题。现在在网上能搜到关于websocket的实践很少,基本能搜到的都是websocket架构和非常简单的例子(tomcat自带就有websocket例子),怎么样能将websocket机制运用起来。首先基本框架准备使用hibernate+spring mvc结合websocket,但是在实际试验中spring mvc和websocket会有部分有冲突。因为到前一段时间Spring Framework 4.0发布的版本中才有了JDK 8的支持和WebSocket编程的支持。所以现阶段需要别的方式来实现spring mvc+websocket。简单的解决方案就是写一个工具类来手动获得bean。解决spring和websocket支持之后需要解决的websocket的交互方式。websocket最直接的两个方法就是onTextMessage和onBinaryMessage,也就是字节流传输和字符流传输。最优方式便是设计一套自己传输协议。通过字节流传输。前后台分别解析协议获取交互操作。其次便可在onTextMessage也就是字符流上做文章。引入json便可以很好支持了。
配置websocket的步骤:
1实现一个类继承ContextLoaderListener,并且在web.xml中配置
1 import javax.servlet.ServletContext; 2 import javax.servlet.ServletContextEvent; 3 4 import org.springframework.context.ApplicationContext; 5 import org.springframework.web.context.ContextLoaderListener; 6 import org.springframework.web.context.support.WebApplicationContextUtils; 7 8 public class SpringLoaderListener extends ContextLoaderListener{ 9 10 @Override11 public void contextInitialized(ServletContextEvent event) {12 super.contextInitialized(event);13 ServletContext context=event.getServletContext();14 ApplicationContext ctx=WebApplicationContextUtils.(context);15 SpringContextutil.setContext(ctx);16 17 }18 19 }
web.xml
1 <listener>2 <listener-class>3 XXXXXX.utils.SpringLoaderListener4 </listener-class>5 </listener>
获得spring bean工具类:
1 import org.springframework.beans.BeansException; 2 import org.springframework.beans.factory.NoSuchBeanDefinitionException; 3 import org.springframework.context.ApplicationContext; 4 5 public class SpringContextUtil { 6 private static ApplicationContext context; 7 8 public static ApplicationContext getContext() { 9 return context;10 }11 12 public static void setContext(ApplicationContext context) {13 SpringContextutil.context = context;14 }15 16 public static Object getBean(String name)throws BeansException{17 return context.getBean(name);18 }19 20 @SuppressWarnings("unchecked")21 public static Object getBean(String name, Class requiredType) throws BeansException { 22 return context.getBean(name, requiredType); 23 } 24 25 public static boolean containsBean(String name) { 26 return context.containsBean(name); 27 } 28 29 public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException { 30 return context.isSingleton(name); 31 } 32 33 @SuppressWarnings("unchecked")34 public static Class getType(String name) throws NoSuchBeanDefinitionException { 35 return context.getType(name); 36 } 37 38 public static String[] getAliases(String name) throws NoSuchBeanDefinitionException { 39 return context.getAliases(name); 40 } 41 42 43 }
引入json所需jar包:
1 <dependency> 2 <groupId>com.google.code.gson</groupId> 3 <artifactId>gson</artifactId> 4 <version>2.2.3</version> 5 </dependency> 6 <dependency> 7 <groupId>net.sf.json-lib</groupId> 8 <artifactId>json-lib</artifactId> 9 <version>2.4</version>10 </dependency>11 <dependency>12 <groupId>net.sf.ezmorph</groupId>13 <artifactId>ezmorph</artifactId>14 <version>1.0.6</version>15 </dependency>
后台需要增加两个文件一个继承WebSocketServlet:
1 import javax.servlet.annotation.WebServlet; 2 import javax.servlet.http.HttpServletRequest; 3 4 import org.apache.catalina.websocket.StreamInbound; 5 import org.apache.catalina.websocket.WebSocketServlet; 6 9 @WebServlet("/room")10 public class RoomSocketServlet extends WebSocketServlet {11 12 private static final long serialVersionUID = -5853470534275847275L;13 14 @Override15 protected StreamInbound createWebSocketInbound(String arg0,HttpServletRequest request) {16 return new RoomMessageInbound();17 }18 19 }
一个继承MessageInbound:
1 public class RoomMessageInbound extends MessageInbound{ 2 private static RoomModel room ; 3 private UserModel user; 4 private CommandDispatcherUtils commandDispatcher; 5 6 public RoomMessageInbound() { 7 if (commandDispatcher == null) { 8 commandDispatcher = (CommandDispatcherUtils) SpringContextutil.getBean("commandDispatcher"); 9 room = RoomListModel.getInstance().getRoom(0);10 }11 }12 13 14 @Override15 protected void onOpen(WsOutbound outbound) 16 room.addUser(outbound.hashCode());17 super.onOpen(outbound);18 }19 20 @Override21 protected void onClose(int status) {22 room.remove(getWsOutbound().hashCode());23 super.onClose(status);24 }25 26 @Override27 protected void onBinaryMessage(ByteBuffer buffer) throws IOException {28 29 }30 31 @Override32 protected void onTextMessage(CharBuffer buffer) throws IOException {33 String msg = buffer.toString();34 JSONObject report = JSONObject.fromObject(msg);35 TemplateCommand command = commandDispatcher.getCommandByKey(report.getString("command"));36 command.execute(msg,user,room);37 }38 39 }
通过JSONObject report = JSONObject.fromObject(msg)就可以将字符串转换为json对象。也就等于通过websocket实现了实时对象信息的传递。
在前端页面中只需要页面载入时的js中加入
1 $(function() { 2 roomsocket = new WebSocket('ws://127.0.0.1:8080/XXXX/room);3 }
在前端向后台发送时将数据JSON.stringify(data)就能json化。
上述代码做了不少删减。所以代码不见得复制就能用。只是提供一种解决方案。况且不久java新的版本或者说Spring Framework 4.0就能很轻松的支持了websocket的实现。主要是还是给自己这段时间的websocket研究做一些总结。随着各种新的技术的诞生,实时web技术已经越来越成熟。websocket是html5的重要特色是值得去看看,研究一下
㈢ Java中的MVC是什么
一、什么是MVC
Model:模型层
View:视图层
Controller:控制层
MVC (Modal View Controler)本来是存在于Desktop程序中的,M是指数据模型,V是指用户界面,C则是控制器。使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。比如一批统计数据你可以分别用柱状图、饼图来表示。C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。
模型-视图-控制器(MVC)是Xerox PARC在八十年代为编程语言Smalltalk-80发明的一种软件设计模式,至今已被广泛使用。最近几年被推荐为Sun公司J2EE平台的设计模式,并且受到越来越多的使用 ColdFusion 和 PHP 的开发者的欢迎。模型-视图-控制器模式是一个有用的工具箱,它有很多好处,但也有一些缺点。
二、MVC如何工作
MVC是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。
视图
视图是用户看到并与之交互的界面。对老式的Web应用程序来说,视图就是由HTML元素组成的界面,在新式的Web应用程序中,HTML依旧在视图中扮演着重要的角色,但一些新的技术已层出不穷,它们包括Macromedia Flash和象XHTML,XML/XSL,WML等一些标识语言和Web services.
如何处理应用程序的界面变得越来越有挑战性。MVC一个大的好处是它能为你的应用程序处理很多不同的视图。在视图中其实没有真正的处理发生,不管这些数据是联机存储的还是一个雇员列表,作为视图来讲,它只是作为一种输出数据并允许用户操纵的方式。
模型
模型表示企业数据和业务规则。在MVC的三个部件中,模型拥有最多的处理任务。例如它可能用象EJBs和ColdFusion Components这样的构件对象来处理数据库。被模型返回的数据是中立的,就是说模型与数据格式无关,这样一个模型能为多个视图提供数据。由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。
控制器
控制器接受用户的输入并调用模型和视图去完成用户的需求。所以当单击Web页面中的超链接和发送HTML表单时,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后用确定用哪个视图来显示模型处理返回的数据。
现在我们总结MVC的处理过程,首先控制器接收用户的请求,并决定应该调用哪个模型来进行处理,然后模型用业务逻辑来处理用户的请求并返回数据,最后控制器用相应的视图格式化模型返回的数据,并通过表示层呈现给用户。
三、为什么要使用 MVC
大部分Web应用程序都是用像ASP,PHP,或者CFML这样的过程化语言来创建的。它们将像数据库查询语句这样的数据层代码和像HTML这样的表示层代码混在一起。经验比较丰富的开发者会将数据从表示层分离开来,但这通常不是很容易做到的,它需要精心的计划和不断的尝试。MVC从根本上强制性的将它们分开。尽管构造MVC应用程序需要一些额外的工作,但是它给我们带来的好处是无庸质疑的。
首先,最重要的一点是多个视图能共享一个模型,正如我所提及的,现在需要用越来越多的方式来访问你的应用程序。对此,其中一个解决之道是使用MVC,无论你的用户想要Flash界面或是 WAP 界面;用一个模型就能处理它们。由于你已经将数据和业务规则从表示层分开,所以你可以最大化的重用你的代码了。
由于模型返回的数据没有进行格式化,所以同样的构件能被不同界面使用。例如,很多数据可能用HTML来表示,但是它们也有可能要用Macromedia Flash和WAP来表示。模型也有状态管理和数据持久性处理的功能,例如,基于会话的购物车和电子商务过程也能被Flash网站或者无线联网的应用程序所重用。
因为模型是自包含的,并且与控制器和视图相分离,所以很容易改变你的应用程序的数据层和业务规则。如果你想把你的数据库从MySQL移植到Oracle,或者改变你的基于RDBMS数据源到LDAP,只需改变你的模型即可。一旦你正确的实现了模型,不管你的数据来自数据库或是LDAP服务器,视图将会正确的显示它们。由于运用MVC的应用程序的三个部件是相互对立,改变其中一个不会影响其它两个,所以依据这种设计思想你能构造良好的松偶合的构件。
对我来说,控制器的也提供了一个好处,就是可以使用控制器来联接不同的模型和视图去完成用户的需求,这样控制器可以为构造应用程序提供强有力的手段。给定一些可重用的模型和视图,控制器可以根据用户的需求选择模型进行处理,然后选择视图将处理结果显示给用户。
四、MVC的缺点
MVC的缺点是由于它没有明确的定义,所以完全理解MVC并不是很容易。使用MVC需要精心的计划,由于它的内部原理比较复杂,所以需要花费一些时间去思考。
你将不得不花费相当可观的时间去考虑如何将MVC运用到你的应用程序,同时由于模型和视图要严格的分离,这样也给调试应用程序到来了一定的困难。每个构件在使用之前都需要经过彻底的测试。一旦你的构件经过了测试,你就可以毫无顾忌的重用它们了。
根据我个人经验,由于我们将一个应用程序分成了三个部件,所以使用MVC同时也意味着你将要管理比以前更多的文件,这一点是显而易见的。这样好像我们的工作量增加了,但是请记住这比起它所能带给我们的好处是不值一提。
MVC并不适合小型甚至中等规模的应用程序,花费大量时间将MVC应用到规模并不是很大的应用程序通常会得不偿失。
五、MVC优点:MVC是一条创建软件的好途径
MVC设计模式是一个很好创建软件的途径,它所提倡的一些原则,像内容和显示互相分离可能比较好理解。但是如果你要隔离模型、视图和控制器的构件,你可能需要重新思考你的应用程序,尤其是应用程序的构架方面。如果你肯接受MVC,并且有能力应付它所带来的额外的工作和复杂性,MVC将会使你的软件在健壮性,代码重用和结构方面上一个新的台阶。
希望对您有所帮助!~