若将原来的SSH架构的JavaWeb项目经理和总监哪个大重构成SpringMvc会带来哪些好处?

在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
学完javaweb基础学习阶段(javase、servlet、jsp等等),现在学框架,可以先跳过struts2、hibernate即ssh,直接学spring、spring-mvc、mybatis(ssm)吗???
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
理论上没什么问题的,因为struts和spring没什么关系,你可以先学习spring的ioc aop,完了之后可以学习spring-mvc,这个时候就算你不学mybatis直接用Jdbc去做dao层,也不会影响一个java web项目的开发,当然你也可以学习了mybatis,然后重构你的dao层,现在用hibernate和struts的也慢慢变少了,主要是hibernate相对Mybatis来说,重量级不少,学习成本也高些,不过好处不用写sql,Struts最近经常爆漏洞,其实也没springmvc好用……个人觉得
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
完全没问题啊,不过如果是为了理解MVC框架结构的话,还是可以看一下struts2,毕竟是个非常好的MVC框架,然后springmvc也是现在比较主流的;学习框架的目的是为了工作上更高效。但是框架都是对最基础的东西的封装,所以,不管学了多少框架方面的东西,千万不要丢下基础。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
可以 跟着老师走
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
本人就是这样学的,跟着某培训机构的视频,把前面的servlet,数据库,jdbc学完,后面开始直接Spring,和前面的ssh没什么关系
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
spring mvc已经是主流
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
千万不要学struts2和hibernate,首先这两个框架很垃圾,其次太浪费时间。
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。梦在翱翔,心在路上。不忘初心,砥砺前行。
【SSH进阶之路】一步步重构MVC实现Struts框架——从一个简单MVC开始(三)
上篇,我们介绍MVC和Struts的基本理论,并实现了一个简单登录的实例。从中我们知道了,Struts是MVC的框架,MVC其实是Model2,M代表了模型,我们可以理解为业务逻辑,V代表了视图,主要是界面显示,使用jsp显示,C代表控制,控制最典型方式是使用servlet,可以获取参数,调用业务逻辑,另外还可以转向其他界面。
经过对上篇博客的介绍,我们知道了Struts对MVC做了封装,Struts到底是怎么封装的MVC,一直还没有解决,从这篇博客开始,我们一步步重构MVC实现一个基本的Struts框架的雏形,帮助我们更深入的学习Struts的基本流程提供保证。下面我们开始。
我们严格按照Model2的时序图或如下图,使用jsp+servlet来给大家演示一个简单的MVC,一步步的重构,完善,把框架的一个实现给大家引出来。
假设是一个关于用户的增、删、改、查的功能,下面我们敲一下各部分的代码。新建java web项目,test_struts1,如下图:
首先,新建一个索引页面,提供一个表单,仅仅提供一个用户姓名,比如实现添加用户功能,作为主界面。
&%@ page language="java" contentType="text/ charset=GB18030"
pageEncoding="GB18030"%&
&!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&
&meta http-equiv="Content-Type" content="text/ charset=GB18030"&
&title&Insert title here&/title&
&form action="servlet/addUser.do" method="post"&
姓名:&input type="text" name="username"&&br&
&input type="submit" value="提交"&&br&
&/html&C,控制器,使用Servlet来实现控制器的职责,取得表单数据,调用业务逻辑,转向页面。客户端一点提交,提交到Servlet,代码如下:
TestServlet.java
package com.liang.
import java.io.IOE
import java.util.L
import javax.servlet.ServletE
import javax.servlet.http.HttpS
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
* 使用servlet做相关的控制,转向多个(V)视图
* @author liang
public class TestServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//取得访问的URI
String reqeuestURI = request.getRequestURI();
System.out.println(reqeuestURI);
//截取URI,获得路径
String path = reqeuestURI.substring(reqeuestURI.indexOf("/",1), reqeuestURI.indexOf("."));
System.out.println(path);
//获得表单数据
String username = request.getParameter("username");
UserManager userManager = new UserManager();
String forward ="";
//根据url执行相关的功能
//等于添加,调用添加方法,添加成功转到添加页面
if("/servlet/addUser".equals(path)){
//调用添加的业务逻辑
userManager.add(username);
forward ="/add_success.jsp";
//删除,调用删除方法,删除成功转到删除
}else if("/servlet/delUser".equals(path)){
//调用删除的业务逻辑
userManager.del(username);
forward ="/del_success.jsp";
//修改,调用修改方法,修改成功转到修改页面
}else if("/servlet/modifyUser".equals(path)){
//调用修改的业务逻辑
userManager.modify(username);
forward ="/modify_success.jsp";
//查询,调用查询方法,查询成功转到查询成功页面
}else if("/servlet/queryUser".equals(path)){
//调用查询的业务逻辑
List userList = userManager.query(username);
request.setAttribute("userList", userList);
forward ="/query_success.jsp";
throw new RuntimeException("请求失败");
//统一完成转向
request.getRequestDispatcher(forward).forward(request, response);
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
控制器需要调用业务逻辑和转到相应页面,给用户提示一下,成功或失败,代码如下:
M,业务逻辑,我们完成增、删、改、查的功能,不再操作数据库,以控制台打印信息的形式,做简单的演示。
UserManager.java
package com.liang.
import java.util.ArrayL
import java.util.L
public class UserManager {
//添加用户
public void add(String username){
System.out.println("UserManager.add()--&&&username:" + username);
//删除用户
public void del(String username){
System.out.println("UserManager.del()--&&&username:" + username);
//修改用户
public void modify(String username){
System.out.println("UserManager.modify()--&&&username:" + username);
//查询用户
public List query(String username){
System.out.println("UserManager.query()--&&&username:" + username);
List userList = new ArrayList();
userList.add("a");
userList.add("b");
userList.add("c");
userList.add("d");
return userL
转向页面,添加成功jsp:
add_success.jsp
&%@ page language="java" contentType="text/ charset=GB18030"
pageEncoding="GB18030"%&
&!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&
&meta http-equiv="Content-Type" content="text/ charset=GB18030"&
&title&Insert title here&/title&
添加成功!
删除成功页面和修改成功页面同上,只有一句表示不同页面。
查询成功页面,query_success.jsp
&%@ page language="java" contentType="text/ charset=GB18030"
pageEncoding="GB18030"%&
&!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&
&meta http-equiv="Content-Type" content="text/ charset=GB18030"&
&title&Insert title here&/title&
查询成功!
&%=request.getAttribute("userList") %&
配置信息web.xml
&?xml version="1.0" encoding="UTF-8"?&
&web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"&
&welcome-file-list&
&welcome-file&index.jsp&/welcome-file&
&/welcome-file-list&
&!-- 配置TestServlet类 --&
&servlet-name&TestServlet&/servlet-name&
&servlet-class&com.liang.servlet.TestServlet&/servlet-class&
&/servlet&
&!-- 怎么访问,与jsp的action的路径一致 --&
&servlet-mapping&
&servlet-name&TestServlet&/servlet-name&
&!-- 只要是.do请求都会到达servlet --&
&url-pattern&*.do&/url-pattern&
&/servlet-mapping&
&/web-app&
最后,搭建tomacat,部署访问。控制台的打印信息,成功的跳转页面不再展示,效果如下:
如果你想访问业务逻辑其他功能,只需要修改index.jsp中的action的值即可。到此为止,我们实现了一个简单的用于增删改查用户功能的MVC。
我们现在看一下上面TestServlet的代码,有很多的问题:
1、所有的业务逻辑和跳转路径都耦合在TestServlet这个类里面了。想添加其他需求,需要修改TestServlet,违反了开放封闭原则。
2、在Servlet里面存在很多的if-else语句,if语句很不稳定,总需要改变。
假如要再添加一个查询功能,需要修改servlet,添加一个if..else语句,太麻烦了,违反了开放封闭原则,扩展性一点都不好。
3、所有的转向页面都写死了,显示和控制分离,如果想换一个视图,要修改代码。
我们一步步将上面的问题都解决,最后实现Struts框架的雏形。下篇博客,首先解决我们的第一个问题。
SSH之struts—如何实现MVC
【SSH框架】-Struts如何实现MVC
浅谈MVC设计模式和SSH框架的关系
MVC架构中M、V、C的解释
没有更多推荐了,大家在公司开发 java web 项目,譬如 SSH 框架或者 SSM 框架( Springmvc+mybatis),是用 tomcat 吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
已注册用户请 &
大家在公司开发 java web 项目,譬如 SSH 框架或者 SSM 框架( Springmvc+mybatis),是用 tomcat 吗?
01:55:36 +08:00 · 3732 次点击
大家在公司开发 java web 项目,譬如 SSH 框架或者 SSM 框架( Springmvc+mybatis ),是用 tomcat 吗?
等开发后,再由部署工程师部署到 weblogic 上
还是直接用 weblogic 开发?
28 回复 &| &直到
23:47:42 +08:00
& & 06:56:59 +08:00 via Android
生产环境就是 tomcat ,前置 nginx 做 ha 和 lb
& & 07:15:02 +08:00 via Android
WebLogic 不是要钱嘛
& & 07:39:30 +08:00 via iPhone
& & 08:06:39 +08:00 via iPhone
& & 08:48:22 +08:00
tomcat + nginx
& & 08:51:40 +08:00
同楼上, nginx+tomcat
& & 08:59:27 +08:00
jetty nginx tomcat
或者直接上 spring boot
& & 09:03:57 +08:00
当然 tomcat , weblogic 太重,但是项目很大的话还是 weblogic 了, tomcat 到 weblogic 坑太多
& & 09:35:23 +08:00 via iPhone
& & 10:29:27 +08:00
@ 毕竟 tomcat 只是支持 servlet 规范
& & 10:54:15 +08:00
生产环境都是 tomcat + nginx
哪来的 weblogic
& & 11:00:30 +08:00 via Android
现在转向 SpringBoot 了。
& & 11:37:23 +08:00 via Android
用 spring boot 打 fat jar 用 docker 部署
& & 11:38:25 +08:00 via Android
nginx 做负载均衡 部署静态资源
& & 12:09:15 +08:00
java 项目用 docker 部署有什么优点?
& & 12:10:08 +08:00 via Android
@ 对 fat jar 守护方便
& & 13:08:04 +08:00
@ 开发的时候用 tomcat+apache , 部署的时候用 nginx+tomcat 会有问题吗?
& & 13:08:41 +08:00
守护的话 无责任推荐 pm2
& & 13:09:37 +08:00
@ 如果打包成 war ,静态页面和资源都在 war 里, war 扔在 tomcat 所在的主机上的话
nginx 如何访问静态资源?
& & 13:12:13 +08:00
war 包难道不是会自动解压的么?
& & 13:20:54 +08:00 via Android
@ 那你去查一下动静分离相关的资料吧,我用 spring boot 时只写 rest 接口,没有静态资源,页面是前端用 mvvm 框架做的
& & 13:23:04 +08:00 via Android
@ 如果不做动静分离用 nginx 配 upstream 然后设置缓存策略就行了
& & 22:58:34 +08:00
是会自动解压,但是假如把 war 包扔在 tomcat 的主机下,解压后也是在 tomcat 的主机啊,不是在 nginx 的主机下
& & 22:58:55 +08:00
@ 开发的时候用 tomcat+apache , 部署的时候用 nginx+tomcat 会有问题吗?
& & 23:25:37 +08:00 via Android
@ 没用过 apache ……
& & 11:27:45 +08:00
& & 16:08:41 +08:00 via Android
@ 不好意思,咨询一下, Spring Boot 部署到生产环境有没有啥坑要填?上 docker 了吗?蟹蟹
& & 23:47:42 +08:00 via Android
@ TomEE 应该支持 ejb 之类的
& · & 1081 人在线 & 最高记录 3541 & · &
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.1 · 18ms · UTC 00:32 · PVG 08:32 · LAX 17:32 · JFK 20:32? Do have faith in what you're doing.下次自动登录
现在的位置:
& 综合 & 正文
改造ssh到springmvc的项目计划
这段时间以来,struts2层出不穷的bug让人实在让人忍无可忍, 终于决心把公司项目从ssh架构改造到spring mvc.
以前没用过spring mvc,花了两天时间研究了一下,发现spring mvc 真的很easy,,项目中用到的struts每个功能,都在spring mvc中作了实现,确实简单,强大。
下面简单介绍一下我的改造方案
一 项目改造步骤
(1)hibernate和spring部分基本不需要修改,保持原状,把struts2的相关依赖包和配置信息删除,引入spring mvc的相关包和配置文件。
(2)由于前台jsp部分只有极少页面使用了stuts的标签库,所以这部分改动极少,把标签删除,用jquery重新实现即可
(3)以前项目中自己包装一个Action的基础工具类BaseAction,需要重新改造,主要是request和response需要页面传递,不能再通过HttpServletResponse response = ServletActionContext.getResponse();等方式获得。
(4)为尽量少改动代码,所有Action全部保留,包括命名方式,其实就是把Action当做Controller,
web.xml中的参数做如下改动
&servlet-mapping&&servlet-name&springmvc&/servlet-name&&url-pattern&*.action&/url-pattern&&/servlet-mapping&
(5)Action中所有方法要带上至少两个参数request,response,如下
public void xxxxxx(HttpServletRequest request, HttpServletResponse response){}
二 工作量估计
(1)项目前台jsp共100多个页面,后台java包括xml文件有400多个
(2)项目组成员全部参于,一周之内应该可以改完,加上项目组成员对spring mvc熟悉时间和bug调试时间,应该可以在一月之内完成改造工作
【上篇】【下篇】764 条评论分享收藏感谢收起赞同 7421 条评论分享收藏感谢收起

我要回帖

更多关于 项目总体架构 的文章

 

随机推荐