你的位置:首页 > Java教程

[Java教程]了解JavaWeb,一篇就够


JavaWeb不能吃。本文将带你在JavaWeb的世界里走马看花,踏雪寻梅,让你明白,JavaWeb究竟是个啥。

JavaWeb中,客户端(比如浏览器页面,用户能够看到的一端)和服务器端(后台服务器要有程序来处理客户端发过来的信息)的交互主要用到了Servlet容器。即:网页前端应用HTML(JSP等),而服务器响应使用的是Servlet(Java程序)。

比如,下面是一个Servlet的Demo,它一般继承HttpServlet,覆盖doGet和doPost方法。doPost有俩入参,req是客户端发送过来的请求信息(如:用户名,密码等),而resp就是该Servlet即将发回客户端的响应信息。该例子将发回客户端界面一段HTML代码,客户将可以看到相关的展示信息。

 

Servlet的重要对象:

HttpServletResponse类a)客户端请求服务器后,服务器就会将返回信息封装到类HttpServletResponse里进行响应。相应时会携带相应状态码:i.100-199:服务端成功接收请求,但要求客户端继续提交下一次请求才能完成全部处理过程。ii.200-299:服务端已经成功接收请求,并完成全部处理过程。iii.300-399:客户端请求的资源已经移交到了别的位置,并向客户端提供了一个新的地址(由HTTP相应消息头的Location字段指定)。iv.400-499:客户端的请求有错误。(使用setError方法设置)v.500-599:服务器端出现错误。vi.使用setStatus设置各种状态响应码。vii.HttpServletResponse提供了一个sendRedirect方法设置响应码302,实现客户端重定向到URL。b)添加和设置响应消息头:addHeader、setHeader。

HttpServletRequest类a)在客户端请求某一个Servlet时,Servlet引擎为这个Servlet创建了一个HttpServletRequest对象来存储客户端的请求信息,并在调用service方法时将HttpServletRequest对象作为参数传给service方法。b)HttpServletRequest接口中定义了若干方法来获取请求行中各部分的消息,比如:i.getMethod,获取请求行中的请求方法(GET、POST等)。ii.getRequestURL,返回资源部分。iii.getQueryString,返回参数部分。iv.等等。c)HttpServletRequest接口中还定义了用于获得客户端和服务器端与网络连接有关的信息的方法。i.getRemoteAttr,返回客户机用于发送请求的IP地址。ii.getRemotePort,返回客户机所使用的网络接口的端口号。iii.getLocalAddr,返回Web服务器上接收请求的网络接口使用的IP地址。iv.还有客户机名称、服务端端口、服务端名称等等。d)接口中还定义了获取请求消息的请求头等等。

Cookiea)Cookie是一种在客户端保存信息的技术。是在浏览器访问某个Web资源时,由Web服务器在HTTP相应消息头中通过Set-Cookie字段发送给浏览器的一组信息。b)浏览器会根据Set-Cookie字段中的Cookie数据决定是否保存这些Cookie。当浏览器下一次访问这个Web资源时,会自动读取这些被保存的Cookie,并加到HTTP请求消息头的Cookie字段中,Web服务器会根据Cookie字段的内容作出相应的处理。c)Web服务器可以给一个Web浏览器发送多个Cookie,但每个Cookie的大小一般被限制为4KB。d)java.servlet.http.Cookie类来封装一个Cookie消息,e)用HttpServletResponse的addCookie方法向浏览器发送Cookie。f)用HttpServletRequest的getCookies方法来读取浏览器传递过来的Cookie信息h)在Cookie中只能保存ISO-8859-1编码支持的字符,如果要在Cookie中保存更复杂的数据,以Base64格式进行编码。
Sessiona)Cookie适宜保存数据量小,结构简单的数据。b)将大量数据保存在服务端并使用SessionID对这些数据进行跟踪,这就是Session技术。c)在Servlet中使用HttpSession类来描述Session,一个HttpSession对象就是一个Session。d)使用HttpSservletRequest的getSession方法获取HttpSession对象。e)HttpSession中封装有各种操作Session信息的方法,如:i.getId:返回当前SessionID.ii.setMaxInactiveInterval,getMaxInactiveInterval:设置、获取session可空闲的最长时间。当某个HttpSession对象在超过这个最长时间后仍然没有被访问时,该HttpSession对象就会失效,整个会话过程结束。iii.getServletContext:返回当前session所属的Web应用程序的ServletContext对象。iv.等等。f)ServletRequest对象存储的对象只能被当前请求的Servlet访问。g)HttpSession存储的对象可以被当前会话中所有的Servlet访问,h)ServletContext对象存储的对象可以被所有的Servlet访问和共享。i)一个请求只能属于一个Session,但是一个Session可以拥有多个请求。j)通过SessionID寻找HttpSession对象的过程也叫做Session跟踪。k)第一次访问URL时,在生成响应消息头时将SessionID作为一个临时Cookie放到了消息头的Set-Cookie字段中,所以可以通过Cookie追踪Session。l)通过重写URL跟踪Sessioni.如果客户端浏览器不支持Cookie或者将Cookie功能关闭,那么就无法使用Cookie来保存和传递SessionID。ii.在Cookie无法工作的情况下使用URL参数传递SessionID。iii.要想通过URL发送SessionID,必须要重写URL。1.encodeURL方法:对所有内嵌在Servlet中的URL进行重写。2.encodeRedirectURL:对sendRedirect方法所使用的URL进行重写。

 

 

HTML是啥?

HTML是超文本标签语言,你看到的一般静态网页就是HTML。给一个Demo大概了解它的结构:

 1 <!DOCTYPE html> 2 <html> 3   <head> 4     <title> 欢迎来到煎饼果子不放葱 </title> 5   </head> 6   <body> 7     <p>这是我的第一个网页,在这里 8       <a href="http://www.cnblogs.com/mesopotamia/"> 9         尽情学习HTML10       </a>吧!11     </p>12   </body>13 </html>

附:HTML的常用标签:

 

1)HTML基本结构组成,<HTML>、<HEAD>、<BODY>等。2)段落格式设置标签,<p>、<br>、<div>、<span>等。3)超级链接标签<a href..>。4)图像标签<img>、表格标签<table>、<tr>、<td>、<th>等。5)框架标签<frame>、<frameset>等。6)表单标签<input>、<select>等。7)等等。

 

 

 

 

有些网页很漂亮,谁装饰了HTML的窗子,谁点缀了HTML的梦?

对于HTML,在外观、方位等布局上需要装饰,这就用到CSS。一段文字的颜色、大小,一个按钮的位置,背景图案,甚至动画效果,都是CSS的功劳。例如:

 

上图中,公告、置顶随笔等文字,博客园、首页等选项,各个标题、内容等,这都是HTML。那“汉谟拉比”的字体颜色是灰色的,“置顶随笔”的字体颜色是蓝色的,“6个月”、“45”等是有下划线的,背景引入了美好的图片,这些,都可以通过CSS来辅助实现。我打开浏览器的调试器状态来看:

左边是界面效果,中间是HTML,右边是CSS样式。

1)CSS是Cascading Style Sheet(层叠样式化表单)的简称,用于给网页元素定义样式(颜色、字体、大小、位置等等)。2)CSS格式分为选择器和样式规则。3)在HTML元素的style属性中定义样式。4)在HTML中定义样式代码。5)在外部文件中定义样式。

 

操作HTML的工具是啥?

那么客户端需要对HTML进行便捷的操作,我想要轻松访问HTML的各个节点并为我们服务,我想要获取浏览器的相关属性信息,以便更好的优化客户端体验,我想要编写一系列方法来操作和控制HTML,那么我们需要使用的是JavaScript。比如:

用getElementById()来取出HTML元素。再比如:navigator.appVersion可以获取浏览器的版本信息。

1)var定义变量。2)原始类型:Undefined、Null、Boolean、Number、String等。3)类型转换:toString()、parseInt等。4)函数定义与函数调用,关键词function。5)类和对象。自定义类的方式,工厂方式、构造函数方式、原型方式等。6)预定义的类,Object、Array、String、Number等。

 

谁辅佐JavaScript来指点江山?

DOM(文档对象模型)把HTML的各个元素,组件都封装成对象的形式,然后JavaScript就可以直接操纵这些对象,从而操纵Html。比如上例中,navigator.appVersion,navigator就是把浏览器信息封装成一个对象,而appVersion是一个属性。

1)DOM的主要功能是获得HTML语言中的各个元素(div、form等),使用对象的方法,很容易获得这些元素的信息,或动态向元素中添加新的元素。2)获取HTML元素的三种方法。a)getElementById。b)getElementsByName。c)getElementsByTagName。

 

有时候需要加载页面的一部分信息,而不想刷新页面,怎么办?

过Servlet进行客户、服务器端交互时,有时页面对服务器返回的数据加载时不需要重新刷新界面,这就用到AJAX技术。用ajax来创建请求、发送请求信息,然后获取响应结果后再根据结果修改页面。用javascript原生ajax技术代码比较复杂,下面看一下jQuery对ajax的用法:(jQuery是基于javascript开发的一个轻量框架,用简洁的指令,统一的规范,让javascript更方便的服务于我们):

 

url是我们发送请求的链接(把请求发给哪个Servlet程序来处理),data是发送的参数。success是发送成功后,接收到响应信息,该怎么处理。再详细一点;

如果我想实现这么一个功能:点击“苹果”按钮,发送请求,后台程序发现请求内容是“苹果”时,返回前台一个“苹果”图片的链接,然后前台页面根据这个链接把苹果图片展示在界面上。(在这里,我们点击“苹果”,展示图片,是静态加载的,我们不希望点击“苹果”后,duang~,页面刷新了一下,这样很影响用户体验。这时,我们用ajax就可以轻松解决)

我们为“苹果”按钮绑定一个调用ajax代码的程序,然后在ajax中,"url"填写处理苹果请求的链接,其他参数不变,"data"写“苹果”,然后success后面的回调函数的参数,就是返回的苹果图片链接,在这个函数内部,我们把链接加载到页面上。

【以无刷新的形式更新HTML内容(幻化于无形)】1)AJAX是JavaScript、CSS、DOM、

Servlet与HTML的交互任务多了会很复杂,怎么简化?

 

通过Jsp技术可以方便利用Servlet进行HTML与服务器的交互,JSP封装了Servlet,更利于开发。也就是说,JSP实际上是一个变相的Servlet,但是它把HTML、CSS、JavaScript、Servlet等柔和在一起,整合成一个页面,这样,所有关于前端的处理都在JSP中进行,后台程序的任务就变得简单清晰。下面是JSP代码示例:

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6  7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9  <head>10   <base href="<%=basePath%>">11   12   <title>My JSP 'demo1.jsp' starting page</title>13   14   <meta http-equiv="pragma" content="no-cache">15   <meta http-equiv="cache-control" content="no-cache">16   <meta http-equiv="expires" content="0">  17   <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">18   <meta http-equiv="description" content="This is my page">19   <!--20   <link rel="stylesheet" type="text/css" href="styles.css">21   -->22 23  </head>24  25  <body>26   <% 27     Date date=new Date();28     out.write(date.toLocaleString());29   %>30  </body>31 </html>

我们可以看到:<% %>里面可以嵌入Java代码;而Java代码中的request其实是Servlet中的request对象,就是前面讲到的HttpSevletRequest对象。JSP封装了Servlet的相关对象,所以我们可以轻而易举的在JSP中获取这些对象。比如,我想获取请求参数,我不必在后台利用HttpSevletRequest来获取,我直接在前台JSP页面中用request.getParameter("...")就能获取,甚至用简洁的符号${}就能获取到。

jsp的主要内置对象:在JSP程序中也需要出现一些常见功能,如向客户端输出信息、处理请求信息、响应消息、获得请求参数、读取配置文件的信息等。这些功能在Servlet中实现起来简单,如通过HttpServletRequest获取请求参数等。在JSP页面中,这些功能是由JSP的内置对象来完成的。从本质上讲,这些内置的对象等同于Servlet中相应的对象。

内置对象out用于向客户端输出文本格式的数据。实际上是JSPWriter对象,由pageContext对象的getOut方法获取。
在使用out对象向客户端输出数据时,系统首先会将这些数据放到out对象的缓冲区中,直到缓冲区被装满或者整个JSP页面结束,这时缓冲区的内容就会被写到由Servlet引擎提供的缓冲区中,最后系统将Servlet引擎中的数据输出到客户端。所以,通过out对象向客户端输出数据一般需要经过两个缓冲区(JSPWriter对象提供的缓冲区和Servlet引擎提供的缓冲区)。内置对象pageContextpageContext封装了JSP页面的运行信息。由于pageContext对象可以获得其他8个内置对象,因此,当JSP页面调用普通的JAVA类时,可以只将pageContext作为参数传入相应的方法。request、response、session对象对应PageContext类的getRequest、getResponse、getSession方法返回,与Servlet相应的对象完全一样。 page对象表示当前JSP页面所对应的Servlet类的对象实例。 exception对象只有page指令的isErrorPage属性值为true时,才会创建。 config对象从config对象中可以获得web.application对象用于获得和当前Web应用程序相关的信息。由PageContext类的getServletContext方法返回。可用于获得全局的初始化参数、某个Web资源的绝对路径等。

 

 

 

在请求任务特别多时,JSP也不能满足需求,这时,出现了MVC(Model、View、Controller)模式,它把谁要展示,谁要处理请求,谁来操作数据库,封装对象等,一一分工,有条不紊。而经典的MVC模式就是struts和spring。

比如,对于spring来说:

  • Spring MVC通过一套MVC注解,让POJO变成处理请求的控制器,无需实现任何接口,同时,SpringMVC还支持REST风格的URL请求:注解驱动和REST风格的Spring MVC是Spring 3.0最出彩的功能之一。
  •  Spring MVC框架围绕 DispatcherServlet这个核心展开,DispatcherServlet是SpringMVC的总导演,它负责截获请求,并将其分派给相应的处理器处理。
  •  和大多数WEB MVC一样,Spring MVC通过一个前端Servlet接收所有的请求,并将具体工作委托给其他组件进行处理,DispatcherServlet就是Spring MVC的前端Servlet。

对于struts来说:

 

  • Struts框架首先需要依赖于过滤器StrutsPrepareAndExecuteFilter来截获Web程序的客户端请求,然后再做进一步处理。

 

  • 在Struts2中通过直接使用Action封装HTTP请求参数,Stuts2中提供了一个Action接口,在该接口中有个execute方法,如果要实现Action接口,就要实现execute方法。Struts2中还提供了一个ActionSupport类,这个类是很多Struts2框架中基础接口的默认实现。Action类通过继承该类,可以简化很多开发。
  • 在JavaWeb程序中最常访问的ServletAPI是HttpServletRequest、HttpSession、ServletContext,这三个类分别与JSP内置对象request、session、application对应。Struts2提供了一个ActionContext类,可以通过这个类来访问相应的ServletAPI。
  • struts的大量工作都是由拦截器实现的,如:params拦截器可以将HTTP请求中的参数解析出来,并将参数值封装在Action属性中。Struts的拦截器机制采用的是嵌套的调用方式。

 

 

 

 

 

 

附:spring的运作原理:

 

要了解Spring MVC框架的工作机理,必须回答下面三个问题:

 

问题一:DispatcherServlet框架如何截获特定的HTTP请求,交由Spring MVC框架处理?

 

答:在web.

 

 

那么,所有带.html后缀的http请求都会被DispatcherServlet截获并处理。

 

问题二:位于Web层的Spring容器(WebApplicationContext)如何与位于业务层的Spring容器(ApplicationContext)相关联,以使web层的bean可以调用业务层的bean?

 

答:下面是一个web.

 

 

ContextLoaderListener是一个ServletContextListener,它通过contextConfigLocation参数指定的配置文件(如本例的applicationContext.

 

问题三:如何初始化Spring MVC的各个组件,并将它们装配到DispatcherServlet中?

 

答:当DispatcherServlet加载后,就会自动扫描上下文的bean,根据名称或者类型匹配的机制查找自定义的组件,找不到时则使用DispatcherServlet.properties中使用的默认组件。