反思java web的发展

本来网站都是一个个静态HTML的,但很快我们就不满足于这样了。动态网页应运而生。
一开始是Servlet。其代码类似于下面这样。
主要是Java代码,然后用out一点一点输出HTML代码。
当然代码无比丑陋,且美工人员几乎不能理解这样的代码。

out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write("<title>首页</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write("Hello, " + new Date().toLocalString
out.write("</body>\r\n");
out.write("</html>\r\n");

所以,很快JSP应运而生。其代码类似于下面这样。
JSP很像是正常的HTML代码中,藏了一些Java代码。
就这样Java Web技术疯狂发展了。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>首页</title>
</head>
<body>

	<ss:a label="首页" href="/index.jsp" />
	<ss:a label="登入" href="/login.jsp" />
	<ss:a label="注册" href="/register.jsp" />
	<ss:a label="登出" href="/logout.do" />
	<hr />

	<jsp:include page="/include/jsp/datetime.jsp" />
	<%
		String user = (String) session.getAttribute("user");
		if (user != null && user.length() > 0) {
			out.println("Welcome, <b>" + user + "</b>! You are logged in.");
		}
	%>

</body>
</html>

随着实际Web应用的使用越来越广泛,Web应用的规模也越来越大,开发人员发现动态Web应用的维护成本也越来越大,即使只需要修改该页面的一个简单按钮文本,或者一段静态的文本内容,也不得不打开混杂的动态脚本的页面源文件进行修改——这是一种很大的风险,完全有可能引入新的错误。

MVC模式的诞生

这时候,人们意识到:单纯使用JSP页面充当过多角色是相当失败的选择,这对于后期的维护相当不利,慢慢地开发人员开始在Web开发中使用MVC模式。

Java阵营慢慢的发展出了适合Java Web开的的MVC模式。(看下图)
使用JSP作为视图,Servlet作为控制器,JavaBean作为模型。
通过合理的分层,使得Java程序员更能驾驭大型网站的开发。

使用MVC模式有一个问题,Servlet中获取到的数据如何传递到视图层呢?

//一般采取这种办法
//在Servlet中将结果设置到request对象当中。
request.setAttribute("result", result);

//在JSP中通过request对象来获取。
<% Object result = request.getAttribute("result"); %>

可是JSP既然是视图层,如果嵌入太多JAVA代码的话,对于美工的工作相当不利。
一般来说视图层是不允许使用<% %>来嵌入JAVA代码的。
可是视图层也确实需要负责进行一些逻辑判断,来动态输出页面。

当然,Java提供了一个办法,使用“自定义标签”,和“EL表达式”。

<table>
    <th>
      <td>序号</td>
      <td>姓名</td>
      <td>性别</td>
      <td>年龄</td>
      <td>电话</td>
    </th>
  <c:forEach var="item" items="${request.list}">
    <tr>
      <td>${item.id}</td>
      <td>${item.name}</td>
      <td>${item.sex}</td>
      <td>${item.age}</td>
      <td>${item.phone}</td>
    </tr>
  </c:forEach>
</table>

视图层的问题看起来不太大,现在来看看控制层。

//首先,你需要在Web.xml中进行配置
<servlet>
  <servlet-name>LoginServlet</servlet-name>
  <servlet-class>com.tee.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>LoginServlet</servlet-name>
  <url-pattern>/Login</url-pattern>
</servlet-mapping>

//然后,需要编写一个继承自HttpServlet类的Servlet。
package com.tee.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RegisterServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException {
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		if (UserDao.validate(username, password)) {
			request.getSession.setAttribute("user", username);
			response.setContentType("text/html; charset=utf-8");
			response.sendRedirect("/index.jsp");
		} else {
			ServletContext sc = getServletContext();
			RequestDispatcher rd = sc.getRequestDispatcher("/login.jsp");
			request.setAttribute("errMsg", "login failure");
			rd.forward(request, response);
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException {
		doGet(request,response);
	}
}

这样一来,首先Web.xml会越来越大,越来越难以维护。
且修改Web.xml的风险很大,只要一个错误,整个网站都有可能无法访问。

上面的例子没有进行传入参数的检验,如是否为空,是否有是规定长度,是否是规定的字符。也没有涉及到参数转换,如转换成Date类型,转换成int类型。一旦发生错误又该如何传递给前端,前端又该如何接受错误信息,如何展示出来。

因为Servlet必须继承自HttpServlet,且内部与Servlet Api高度耦合,不但难以测试,而且难以重用。更不要说我们总是需要书写大量与业务逻辑无关的代码。

MVC框架的诞生
同样的代码写两次就是罪过,所以我们需要什么东西来让我们解放出来。
很快人们就发展出了一套MVC框架,特别是适合于Java Web的MVC框架。

MVC框架能帮我们做什么?

这里引用“四刘”的回答:
框架和普通库的几点区别里,我认为最重要的一点是控制反转。
框架规定了开发者写哪些代码/不写哪些代码,怎么写代码——这就是框架主要解决的问题。

MVC框架实现了MVC模式。什么意思?
意思是只要你根据框架的要求填充代码,你就能够很简单的实现MVC模式。

谁来响应用户请求?框架可能告诉你,Action就是用来响应用户请求的。
不用再继承HttpServlet,代码中也可以完全脱离Servlet Api。复用度高,可单元测试。

谁负责生成响应界面?框架可能告诉你,可以用一个JSP文件来生成界面。
也可以用其他视图技术,JfreeChart,FreeMarke,JasperReports,JSF,Tiles,Vlocit等。

如何将网址匹配到Action?框架可能告诉你,在XML文件中配置,且可以分模块配置。
如何确定该返回那个JSP?框架可能告诉你,在XML文件中配置好了,Action返回SUCCESS,INPUT,LOGIN等等即可。

Action如何接受参数?框架可能告诉你,写个Setter方法,就可以接受相应参数。不用再从request获取,且类型可自动转换。根据配置处理编码问题。
Action如何与视图交互?框架可能告诉你,Action自动与视图绑定,在Action写一个Getter方法,试图层就可以用自定义标签获取其值。

输入校验如何进行?写个validate方法,有错误就调用addActionError方法,自动返回配置中,INPUT指定的页面,页面用<s:actionerrors/>标签就可以自动输出错误信息。
也可以使用addFieldError方法添加特定field的错误,使用<s:fielderror/>输出特定field的错误信息。
甚至使用<s:textfield>方法生成的输入框,可以自动显示该字段的错误信息。

来自为知笔记(Wiz)

时间: 2024-11-01 14:20:18

反思java web的发展的相关文章

Java Web底层(1)

当前Java Web的发展可以说进入到一个极为繁杂庞大的体系,各种框架层出不穷,但是究其本源,其实就是JSP/Servlet/Filter的一种精巧封装,因此了解其底层本质对学习框架并了解其工作原理是十分重要的.本文主要从底层细节开始,阐述Java Web中所需要接触到的底层技术细节. 第一是开发环境的搭建,这里不再复述.这里需要注意的是,J2EE本质上是一套接口规范,针对该接口规范各个产品有不同的实现途径和方法,因此这也是为什么在建立动态网站项目之后,直接书写JSP或者Servlet会报错的原

关于java web开发需要哪些技术要求(简单的web界面管理系统)

目前, 国内外信息化建设已经进入基于Web应用为核心的阶段, Java作为应用于网络的最好语言,前景无限看好.然而,就算用Java建造一个不是很烦琐的web应用,也不是件轻松的事情.概括一下,实施Java的WEB项目需要掌握的技术如下: lJava语言 l面向对象分析设计思想 l设计模式和框架结构 lXML语言 l网页脚本语言 l数据库 l应用服务器 l集成开发环境 下面我们具体地看每个技术. 1.Java语言 Java语言体系比较庞大,包括多个模块.从WEB项目应用角度讲有JSP.Servle

建站之买完虚拟主机之后怎么把Java web工程传进去

传进去也是没有用的,因为你没有tomcat这样的服务器.只有虚拟服务器才能安装服务器之类的软件. 虚拟主机只能使用其预装好的web server和数据库(Window版本下是IIS和SQL Server,Linux版本下是Apache和MySQL,这两种都不支持Java Web应用). 可以购买其云服务器,自己安装JDK和需要的软件来部署Java Web应用. 虚拟住主机就是将一台主机用软件分为多个分区,比如一台ip为192.168.1.1的主机,服务商(空间商)为了赚取更多的利润,他会将这台主

JAVA WEB 环境的搭建及所需的技术简介

web 开发,有点头疼,从最初一点一点开始查找,服务器查了好久才知道是什么意思,╮(╯▽╰)╭ 还有,最近再练盲打, 祝我成功咯~ 一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 静态web资源(如html 页面):指web页面中供人们浏览的数据始终是不变. 动态web资源:指web页面中供人们浏览的数据是由程序产生的,不同时间点访问web页面看到的内容各不相同

Java Web项目开发到底需要掌握哪些技术?

目前, 国内外信息化建设已经进入基于Web应用为核心的阶段, Java作为应用于网络的最好语言,前景无限看好.然而,就算用Java建造一个不是很烦琐的web应用,也不是件轻松的事情.概括一下,实施Java的WEB项目需要掌握的技术如下: lJava语言 l面向对象分析设计思想 l设计模式和框架结构 lXML语言 l网页脚本语言 l数据库 l应用服务器 l集成开发环境 下面我们具体地看每个技术. 1.Java语言 Java语言体系比较庞大,包括多个模块.从WEB项目应用角度讲有JSP.Servle

Java Web表达式注入

原文:http://netsecurity.51cto.com/art/201407/444548.htm 0×00 引言 在2014年6月18日@终极修炼师曾发布这样一条微博: 链接的内容是一个名为Jenkins的服务,可以在没有password的情况下受到攻击.而攻击方法比较有趣,Jenkins提供了一个Script Console功能,可以执行Groovy 脚本语言.下面我们来看下维基百科对于这个脚本语言的解释:  Groovy是Java平台上设计的面向对象编程语言.这门动态语言拥有类似P

Java Web高性能开发(三)

今日要闻: Clarifai:可识别视频中物体 最近几年,得益于深度学习技术的发展,谷歌和Facebook等企业的研究人员在图形识别软件领域取得了重大突破.现在,一家名为Clarifai的创业公司则提供了一项新服务,利用深度学习技术来理解视频内容. 深度学习需要借助一个模拟"神经元"的网络来处理数据,并且利用实例数据对其进行训练.Clarifai的技术源自纽约大学的研究,该公司2013年在一项著名的图片内容识别软件竞赛中取得前五名. 今日英文: http://docs.oracle.c

[Java Web] 1\Web开发初识——一大堆历史和技术名词

LZ前言 LZ最近发现网络真是个神奇的东西,以前做的好玩的只能自娱自乐(或者说顾影自怜),现在只要发一个帖子,写一个博客,很快能引来一大群小伙伴的围观(有时候还能遇见几个大牛给个战略性的指导)...LZ本来是搞硬件的:从CPU的制造(VHDL).数电.模电再到计算机组成原理.汇编.接口技术,底层的东西算是走马观花地懂了点皮毛,正好大一的时候又了解一点计算机的编程知识(当时第一次用C++Build写出来个Hollo World那个欣喜呀~后来又从win32学到MFC再到C#,嘿嘿,基本上还是皮毛吧

JAVA Web学习篇--Servlet

Servlet由来 做过BS项目的人都知道,浏览器可以依据HTML静态标记语言来显示各式各样的网页.可是假设我们须要在网页上完毕一些业务逻辑:比方登陆验证.或者说网页显示的内容在server的数据库中.假设是这样,除了负责显示的HTML标记之外,必须还要有完毕这些业务功能的代码存在.这样的网页我们就叫做动态网页. 对于静态网页而言,server上存在的是一个个纯HTML文件.当client浏览器发出HTTP请求时,server能够依据请求的URL找到相应的HTML文件,并将HTML代码返回给cl