web开发初级学习_第1页
web开发初级学习_第2页
web开发初级学习_第3页
web开发初级学习_第4页
web开发初级学习_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、oschina 软件库有一个分类web框架,该分类中包含多种编程语言的将近500个项目。web框架是开发者在使用某种语言编写web应用服务端时关于架构的最佳实践。很多web框架是从实际的web项目抽取出来的,仅和web的请求和响应处理有关,形成一个基础,在开发别的应用项目的时候则可以从这个剥离出来的基础做起,让开发者更关注更具体的业务问题,而不是web的请求和响应的控制。框架很多,但套路基本类似,帮你隐藏很多关于 http 协议细节内容,专注功能开发。但对一个初学者来说,过早的接触框架往往是事倍功半!同样一个问题,换一种框架你可能需要从头开始研究。下面是针对初学 java 开发 web 过程一

2、些个人见解和思路,高手可略过。1. 基本要求:java 编程基础有良好的 java 语言编程基础,这是必须的,在讨论 web 开发技术时提了一个 java 编程基础的问题会被鄙视的。2. 环境准备 (eclipse + tomcat)选择一个你喜爱的servlet容器,或者说大一点就是应用服务器,推荐 tomcat 、resin 或者 jetty 这些轻量级的产品。这三个产品下载 zip 包解压后就可以用了。如果你不熟悉 tomcat 的话请不要使用 exe 版本的 tomcat,那会徒增很多烦恼。也不建议在 eclipse 等一些开发环境中集成 tomcat 的做法,也会徒增烦恼。把应用服务

3、器启动起来并能访问到其默认的页面为准。关于开发工具不推荐使用 myeclipse 和 eclipse 的 jee 版本,徒增烦恼、运行缓慢而且还让你无法了解 web 项目的结构。普通的 eclipse 或者你喜欢的开发工具就足够了,能支持普通 java 项目开发即可。为了方便,我做了一个最基本的java 项目 servletdemo.zip ,你可将它导入到 eclipse 里就是一个完整的、最简单的 web 项目。然后将下面 xml 内容替换 tomcat 下的 conf/server.xml 文件:01<?xml version='1.0' encoding='

4、;utf-8'?>02<server port="8005" shutdown="shutdown">03 <service name="catalina">04 <connector port="8080" protocol="http/1.1" connectiontimeout="20000"redirectport="8443" uriencoding="utf-8"/>05 &

5、lt;engine name="catalina" defaulthost="localhost">06 <host name="localhost">07 <context path="" docbase="d:workdirservletdemowebapp" reloadable="true"/>08 </host>09 </engine>10 </service>11</server>其中

6、d:workdirservletdemo 替换为你导入的项目路径,再次启动 tomcat 后在浏览器打开 http:/localhost:8080/hello 便可看到 hello world 的输出信息。3. 了解 servlet 和 filter好了,我已经把环境搭起来了,接下来该干嘛呢?前面的步骤为的是搭建一个测试的环境,然后让你了解一个最基本的 java web 项目的结构。一个最基本的 java web 项目所需的 jar 包只需要一个 servlet-api.jar ,这个 jar 包中的类大部分都是接口,还有一些工具类,共有 2 个包,分别是 javax.servlet 和 ja

7、vax.servlet.http。我把这个jar包放到了 webapp 目录外的一个独立 packages 文件夹里,这是因为所有的 servlet 容器都带有这个包,你无需再放到web项目里,我们放到这里只不过是编译的需要,运行是不需要的。如果你硬是把 servlet-api.jar 放到 webapp/web-inf/lib 目录下,那么 tomcat 启动时还会报一个警告信息。java web 项目还需要一个非常重要的配置文件 web.xml ,在这个项目中已经被我最小化了,只保留有用的信息:01<?xml version="1.0" encoding=&quo

8、t;utf-8"?>02<!doctype web-app public "-/sun microsystems, inc./dtd web application 2.3/en"03 "04<web-app>05 06 <servlet>07 <servlet-name>hello_world</servlet-name>08 <servlet-class>demo.helloservlet</servlet-class>09 <load-on-startup&g

9、t;1</load-on-startup>10 </servlet>11 12 <servlet-mapping>13 <servlet-name>hello_world</servlet-name>14 <url-pattern>/hello</url-pattern>15 </servlet-mapping>16 17</web-app>每个 servlet 都必须在 web.xml 中定义并进行 url 映射配置,早期 java 开发 web 在没有框架满天飞的时候,这个文件会定义

10、了大量的 servlet,或者有人为了省事干脆来一个 /servlet/* 来通过类名直接调用 servlet。servlet 规范里还有另外一个非常重要而且非常有用的接口那就是 filter 过滤器。下面是一个最简单的 filter 类以及相应的定义方法:01package demo;02 03import java.io.ioexception;04 05import javax.servlet.filter;06import javax.servlet.filterchain;07import javax.servlet.filterconfig;08import javax.servl

11、et.servletexception;09import javax.servlet.servletrequest;10import javax.servlet.servletresponse;11import javax.servlet.http.httpservletrequest;12 13public class hellofilter implements filter 14 15 override16 public void init(filterconfig arg0) throws servletexception 17 system.out.println("fil

12、ter 初始化");18 19 20 override21 public void dofilter(servletrequest req, servletresponse res,22 filterchain chain) throws ioexception, servletexception 23 httpservletrequest request = (httpservletrequest)req;24 system.out.println("拦截 uri="+request.getrequesturi();25 chain.dofilter(req,

13、res);26 27 28 override29 public void destroy() 30 system.out.println("filter 结束");31 32在 web.xml 中的配置必须放在 servlet 的前面:01<?xml version="1.0" encoding="utf-8"?>02<!doctype web-app public "-/sun microsystems, inc./dtd web application 2.3/en"03 "04&l

14、t;web-app>05 06 <filter>07 <filter-name>hellofilter</filter-name>08 <filter-class>demo.hellofilter</filter-class>09 </filter>10 11 <filter-mapping>12 <filter-name>hellofilter</filter-name>13 <url-pattern>/*</url-pattern>14 </fil

15、ter-mapping>15 16 <servlet>17 <servlet-name>hello_world</servlet-name>18 <servlet-class>demo.helloservlet</servlet-class>19 <load-on-startup>1</load-on-startup>20 </servlet>21 22 <servlet-mapping>23 <servlet-name>hello_world</servlet-

16、name>24 <url-pattern>/hello</url-pattern>25 </servlet-mapping>26 27</web-app>访问 http:/localhost:8080/hello 时看看 tomcat 控制台有何输出信息。4. servlet 和 http 的对应关系servlet 是 j2ee 最重要的一部分,有了 servlet 你就是 j2ee 了,j2ee 的其他方面的内容择需采用。而 servlet 规范你需要掌握的就是 servlet 和 filter 这两项技术。绝大多数框架不是基于 serv

17、let 就是基于 filter,如果它要在 servlet 容器上运行,就永远也脱离不开这个模型。为什么 servlet 规范会有两个包,javax.servlet 和 javax.servlet.http ,早先设计该规范的人认为 servlet 是一种服务模型,不一定是依赖某种网络协议之上,因此就抽象出了一个 javax.servlet ,同时在提供一个基于 http 协议上的接口扩展。但是从实际运行这么多年来看,似乎没有发现有在其他协议上实现的 servlet 技术。javax.servlet 和 javax.servlet.http 这两个包总共加起来也不过是三十四个接口和类。你需要通

18、过 j2ee 的 javadoc 文档 熟知每个类和接口的具体意思。特别是下面几个接口必须熟知每个方法的意思和用途:· httpservlet· servetconfig· servletcontext· filter· filterconfig· filterchain· requestdispatcher· httpservletrequest· httpservletresponse· httpsession· 一些 listenser 类再次强调 httpservletrequ

19、est 和 httpservletresponse 这两个接口更应该是烂熟于心。如果你从字面上无法理解某个方法的意思,你可以在前面那个项目的基础上做实验看看其输出,再不行你可以到讨论区提问,这样的提问非常明确,很多人都可以帮到你。为什么我这么强调 httpservletrequest 和 httpservletresponse 这两个接口,因为 web 开发是离不开 http 协议的,而 servlet 规范其实就是对 http 协议做面向对象的封装,http协议中的请求和响应就是对应了 httpservletrequest 和 httpservletresponse 这两个接口。你可以通过

20、httpservletrequest 来获取所有请求相关的信息,包括 uri、cookie、header、请求参数等等,别无它路。因此当你使用某个框架时,你想获取http请求的相关信息,只要拿到 httpservletrequest 实例即可。而 httpservletresponse接口是用来生产 http 回应,包含 cookie、header 以及回应的内容等等。5. 再谈谈 sessionhttp 协议里是没有关于 session 会话的定义,session 是各种编程语言根据 http 协议的无状态这种特点而产生的。其实现无非就是服务器端的一个哈希表,哈希表的key就是传递给浏览器的

21、名为 jsessionid 的 cookie 值。当需要将某个值保存到 session 时,容器会执行如下几步:a. 获取 jsessionid 值,没有的话就生成一个,也就是 request.getsession() 这个方法b. 拿到的 httpsession 对象实例就相当于一个哈希表,你可以往哈希表里存放数据(setattribute)c. 你也可以通过 getattribute 来获取某个值而这个名为 jsessionid 的 cookie 在浏览器关闭时会自动删除。把 cookie 的 maxage 值设为 -1 就能达到浏览器关闭自动删除的效果。6. 关于 jsp首先我已经不用

22、jsp 很多年了,现在一直是使用 velocity 模板引擎。任何一个 jsp 页面在执行的时候都会编译成一个 servlet 类文件,如果是 tomcat 的话,这些生成的 java 文件会放置在 tomcat/work 目录下对应项目的子目录中,例如 tomcat 生成的类文件如下:01package org.apache.jsp;02 03import javax.servlet.*;04import javax.servlet.http.*;05import javax.servlet.jsp.*;06import java.util.*;07 08public final class

23、 test_jsp extends org.apache.jasper.runtime.httpjspbase09 implements org.apache.jasper.runtime.jspsourcedependent 10 11 private static final jspfactory _jspxfactory = jspfactory.getdefaultfactory();12 13 private static java.util.list<string> _jspx_dependants;14 15 private javax.el.expressionfa

24、ctory _el_expressionfactory;16 private org.apache.tomcat.instancemanager _jsp_instancemanager;17 18 public java.util.list<string> getdependants() 19 return _jspx_dependants;20 21 22 public void _jspinit() 23 _el_expressionfactory = _jspxfactory.getjspapplicationcontext(getservletconfig().getse

25、rvletcontext().getexpressionfactory();24 _jsp_instancemanager = org.apache.jasper.runtime.instancemanagerfactory.getinstancemanager(getservletconfig();25 26 27 public void _jspdestroy() 28 29 30 public void _jspservice(final httpservletrequest request, final httpservletresponse response)31 throws ja

26、va.io.ioexception, servletexception 32 33 final pagecontext pagecontext;34 httpsession session = null;35 final servletcontext application;36 final servletconfig config;37 jspwriter out = null;38 final object page = this;39 jspwriter _jspx_out = null;40 pagecontext _jspx_page_context = null;41 42 43

27、try 44 response.setcontenttype("text/html;charset=utf-8");45 pagecontext = _jspxfactory.getpagecontext(this, request, response,46 null, true, 8192, true);47 _jspx_page_context = pagecontext;48 application = pagecontext.getservletcontext();49 config = pagecontext.getservletconfig();50 sessi

28、on = pagecontext.getsession();51 out = pagecontext.getout();52 _jspx_out = out;53 54 out.write("rn");55 out.write("<html>rn");56 out.write(" <title>test</title>rn");57 out.write(" <style>rn");58 out.write(" </style> rn")

29、;59 out.write(" <body>rn");60 out.write("<h1>test demo (oschina)</h1>rn");61 out.write("<table cellspacing="1" cellpadding="5">rn");62 63enumeration names=request.getheadernames();64while(names.hasmoreelements()65string name=(string)names.nextelement();66string value=request.getheader(name);67 68 out.write("rn");69 out.write(" <tr>rn");70 out.write(" <td>");71 out.print(name);72 out.write("</td>rn");73 out.write(" <td>

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论