Java Web学习笔记1

+ URL格式说明

http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name

从上面的URL可以看出,一个完整的URL包括以下几部分:
1.协议部分:该URL的协议部分为“http:”,这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等本例中使用的是HTTP协议。在"HTTP"后面的“//”为分隔符

2.域名部分:该URL的域名部分为“www.aspxfans.com”。一个URL中,也可以使用IP地址作为域名使用

3.端口部分:跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口

4.虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。本例中的虚拟目录是“/news/”

5.文件名部分:从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名

6.锚部分:从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个URL必须的部分

7.参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“boardID=5&ID=24618&page=1”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。

+ HTTP 请求和响应

Request       请求行(request line)、请求头部(header)、空行和请求数据四个部分组成

Response 响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文

状态码说明:

1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。

HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

GET和POST方法区别:GET提交,请求的数据会附在URL之后,特定浏览器和服务器对URL长度有限制

+ 常用的Web服务器

IIS、Apache、Tomcat、JBoss、Weblogic、Websphere

+ Web开发历史

静态页面——>CGI——>Servlet(单例)——>JSP——MVC及各种框架

+ 本机Tomcat访问

localhost:8080 127.0.0.1:8080   本机IP地址:8080(其他主机访问可以使用此地址)

.../conf/server.xml是Tomcat的主要配置文档,绝大多数的配置都在此文档中。


+ Servlet工作流程

Tomcat将浏览器的请求封装为HttpServletRequest类型的request对象,把响应封装为HttpServletResponse类型的response对象,然后把request和response作为参数调用Servlet的相应方法完成处理。

Web程序部署在Tomcat的/webapps目录下,一个典型Web应用程序结构如下:


Servlet是一种实现了javax.servlet.Servlet接口的类,直接实现此接口来编写很不方便,javax.servlet.http.*提供了对Servlet的支持,编写Servlet时直接继承HttpServlet即可。

web.xml中<load-on-start>为1则Tomcat启动时加载该Servlet,否则在第一次请求时加载。

一个完整的Servlet包括Servlet类、<servlet>配置、<servlet-mapping>配置,缺一不可。

<init-param>和<context-param>

@Resource,资源注射,<env-entry>动态注入参数值。资源注射原理是JNDI。

HTML中使用FORM提交数据,FORM的action属性设置数据提交到哪个url,GET提交时url总长度不能超过255。

+ Servlet生命周期

Servlet在服务器启动时或客户端第一次请求时创建,只会创建一个实例,创建时调用init方法,服务器时关闭时Servlet销毁,调用destroy方法。

@PostConstruct注解修饰的方法会在加载Servlet的时候运行,并且只会被服务器调用一次;@PreDestroy注解修饰的函数会在服务器卸载Servlet的时候运行,只被调用一次;如果应用程序中没有使用任何注解,则在web.xml中设置<web-app>的metadata-complete属性为true来关掉服务器启动时例行的注解检查。

+ Servlet之间的跳转

通过RequestDispatcher对象的forward方法来实现跳转,RequestDispatcher可以通过HttpServletRequest的getRequestDispatcher方法获得,Forward是MVC框架中常用的一种技术,不仅可以跳转到本应用的另一个Servlet、JSP页面,也可以跳转到另外一个文件。

+ Servlet3.0

Servlet3.0抛弃了采用web.xml配置Servlet、Filter、Listener的繁琐步骤,允许使用Annotation修饰他们,javax.servlet.annotation提供了如下Annotation:@WebServlet、@WebInitParam、@WebListener、@WebFilter、@MultipartConfig,@ServletSecurity等。

+ JSP

当用来动态生成HTML页面时用Servlet会比较麻烦,每个输出都要调用out.println,用JSP实现会更简单。JSP是HTML和Java的混合体,HTML部分遵循HTML语法,Java部分遵循Java语法,编译后的JSP跟HttpServlet一样,都是javax.servlet.Servlet接口的子类,因此JSP是另一种形式的Servlet。JSP包括很多技术,包括JavaBean、自定义标签、EL表达式、JSTL标签库等。

HttpServlet是先编译后部署,而JSP则是先部署源代码后编译为class文件的,先部署后编译。JSP只会在客户端第一次请求的时候被编译,所以第一次请求JSP时会感觉到比较慢,后面就快多了。JSP也是Servlet,也会调用init和destroy方法,但它还有自己的_jspInit和_jspDestroy方法。

JSP源代码可分为模板数据与元素,模板数据就是HTML代码,内容是固定的,元素是Java部分,包括脚本以及JSP指令和JSP标签等。

JSP脚本必须用<% %>括起来,否则被视为模板数据。源程序中可以用out.println输出,也可以用<%=%>输出,JSP注释为<%-- --%>。

JSP可以声明属性和方法(全局变量),在<%! %>之间声明。

JSP包含if-else、for、while、return、break

JSP指令用来声明JSP页面的一些属性,以<%@ %>包含,格式为<%@ directive {attribute=value}*%>,常用指令有page、include和taglib。

JSP行为是一组JSP内置的标签,是对常用的JSP功能的抽象与封装,JSP行为格式<jsp:element {attribute="value"}/>。<jsp:include page="relativeURI" flush="true"/>行为,与<%@inlcude%>指令的原理和发生时刻都不一样,指令是在编译时包含,行为是在运行时包含而且只包含运行结果。JSP开发中推荐全部使用JSP行为。

JavaBean就是普通的Java类(POJO),JavaBean类非常简单,简单到只有私有属性与对应的getter和setter方法。

useBean行为格式:<jsp:useBean id="beanId" class="className" scope="Value"/>  scope可以为page、request、Session和application。

<jsp:plugin/>嵌入Applet,<jsp:forward/>、<jsp:directive/>、<jsp:directive.page/>、<jsp:directive.include/>、<jsp:directive.taglib/>.....

JSP的9个内置对象:out、request、response、config、session、application、page、pageContext、Exception。

JSP文件部署到服务器后便可以直接访问,不像Servlet那样必须在web.xml中配置。

+ EL表达式

EL表达式是用${}括起来的脚本,写在JSP的HTML代码中,EL表达式提供了获取对象及属性的简单方式,EL表达式支持算术运算、比较、逻辑运算符

+ 会话跟踪

HTTP协议是无状态的协议,一旦数据交换完毕,连接就会关闭。

Cookie保存在客户端,具有不可跨域性;Session保存在服务器上,Session一般放在内存里,在用户第一次访问服务器的时候创建,只有访问JSP、Servlet时才会创建Session,Session有有效期,Session需要使用Cookie作为识别标志。如果客户端不支持Cookie,通过URL地址重写来跟踪客户会话。

Cookie只能保存ASCII字符串,Session可以存取任何类型数据包括Java对象和类;Cookie存储在客户端,可能会被嗅探,Session则不会;Cookie默认有效期长,Session有效期太长会影响服务器性能;高并发网站不太可能使用Session,对服务器负担太重;Cookie需要客户端浏览器支持;Cookie支持跨域名访问,Session不支持;

+ Filter

Filter对request和response进行预处理。一个Filter必须实现javax.servlet.Filter接口,Filter有3个方法:init、doFilter和destroy,init和destroy只调用一次,doFilter中一定要执行chain.doFilter,否则request不会交给后面的Filter或Servlet。Filter要在web.xml中配置才能生效,Filter执行的先后顺序取决于在<filter-mapping>中配置的先后顺序。

Filter经典案例:防盗链、字符编码、日志记录、异常捕捉、权限验证、、内容替换、GZIP压缩、图像水印、缓存、XSLT转换、文件上传

+ Listener

用于监听Java Web程序中的事件,如创建、修改、删除Session、context等,Listener需要在web.xml中配置才会生效。

Listener经典案例:单态登录、显示在线用户

+ JSTL

EL表达式使用很方便,但是功能有限如不能遍历集合,因此需要JSTL的配合,JSTL和EL配合可以实现所有的功能。JSP标签是专门用于显示数据的,可重复利用的类库。标签包括标签前缀、标签名称、标签属性以及标签体,JSP会把简单的标签解释为相应的HTML代码。JSP行为是一组内置的JSP标签。

使用了HTML和Java的JSP会有HTML代码和<% %>混在一起,可读性和维护性都比较差,JSP标签遵循XML标签的语法,JSP中推荐使用JSP标签而不用Scriptlet(Java脚本)。JSTL是最基本的标签库,实现了最基本的功能。

core标签库是JSTL最基本的标签库。<c:out/>输出数据,<c:if/>,if标签没有else功能,所以可以使用<c:choose/> 、<c:when/>、<c:otherwise/>。<c:forEach/>不仅可以当循环使用还可以遍历集合对象,它有varStatus属性。<c:forTokens/>用于遍历字符串。<c:set/>,var属性只能设置Integer、Double、Float、String等类型数据,不能操作JavaBean后者Map等复杂数据类型,target属性只能用来操作JavaBean或者Map。<c:remove/>。<c:catch/>捕捉异常。<c:import/>、<c:url/>、<c:redirect/>、<c:param/>。

fmt标签库,<fmt:requestEncoding/>设置编码,<fmt:setLocale/>显示所在地区的数据格式,<fmt:timeZone/>显示全球时间,<fmt:setTimeZone/>。<fmt:budle/>、<fmt:message/>、<fmt:param/>资源国际化。

fn方法库,遵循fn:methodName()格式,fn:contains()显示用户浏览器、操作系统,必须在EL表示式内使用;fn:endsWith()显示文件格式,fn:indexOf()...

sql标签库,<sql:setDataSource/>,<sql:query/>,<sql:update/>....

xml标签库。

+ 自定义标签

任何一个标签都对应一个Java类,必须实现Tag接口,Tag实现类有了还需要在tld文件中配置一下,JSP调用Tag方法的流程:


多数情况下,不需要实现Tag接口,使用TagSupport类就可以了;定义带参数的标签只需要给类加一个属性及相应的setter方法就可以了。BodyTag专门处理带标签体的标签。

+ 资源国际化

资源国际化:I18N,资源本地化:I10N。

+ JDBC

根据存储模型的不同,数据库主要分为网状数据库、关系数据库、树状数据库和面向对象数据库等。企业级Java内置Derby数据库。

JDBC是Java规定的访问数据库的标准API,使用JDBC访问MySQL需要相应的驱动。JDBC定义了数据库的连接,SQL语句的执行以及查询结果集的遍历等,JDBC把这些操作定义为接口,位于java.sql包下。

JDBC基本操作:CRUD。

查询数据遵循的流程:注册MySQL驱动——获取Connection——创建Statement——查询数据库返回ResultSet对象——遍历ResultSet输出数据——关闭ResultSet——关闭Statement——关闭Connection。

DAO(数据库操作对象)是JDBC下常用的模式,所有与数据库相关的操作在DAO层实现,Servlet或JSP中只操作Java Bean与DAO层。

MySQL插入中文时显示ERROR 1406 (22001):data too long for column的错误提示,原因时我创建数据库的时候设置了编码方式为utf8,解决方法在窗口执行   set names utf8;(只对当前窗口有效)。

+ XML

用来存储和交换数据,最大特点就是可扩展性。数据定义Schema、DTD;数据解析DOM、SAX;样式风格XSTL;实现语言Java、.Net、JavaScript。

格式说明:

1、XML首先要有文档声明,形如<?xml version="1.0" encoding="UTF-8"?>

2、标记必须闭合,如<title>xxx</title>,当没有文本节点时可以采取自封闭语法对该元素节点进行关闭,如<title/>

3、必须合理嵌套

4、元素名字可以包含字母、数字和其他字符,不能以数字或标点符号开头,不能以XML开头,不能包含空格

5、XML属性是XML元素的一部分,属性值必须用单引号或双引号括起来

6、只有一个根元素

7、大小写敏感

8、空白被保留

9、注释和HMTL一样是<!--  -->

10、转义字符使用  &lt;    &gt;    &amp;    &apos;    &quot;

11、CDATA的使用    包含大量转移字符时,保持原有字符特性不被转义,以<![CDATA[开始,以]]>结束。

12、JDK中涉及XML的API有两个:JAXP负责解析、JAXB负责将XML映射为Java对象。

+ 其他

1、大规模Java平台的分类:拥有大量的小堆Java虚拟机、较少的大堆Java虚拟机、两者的结合。大规模Java平台的虚拟化和调优有4种需求趋势:计算资源的合并、JVM的合并、弹性和灵活性、性能。将堆小于1G的JVM合并为4G和6G的。

2、CDN,内容分布网络,其目的是通过在现有Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络边缘,使用户可以就近获取所需内容,提高网站响应速度,CDN=镜像+缓存+整体负载均衡。目前CDN都以缓存网站中的静态数据为主,如CSS、JS、图片和静态页面等。

3、负载均衡就是对工作任务进行平衡,分摊到多个操作单元上执行,共同完成工作任务。通常有3种负载均衡架构,分别是链路负载均衡、集群负载均衡和操作系统负载均衡。

4、ASP将Web上的请求转入到 IIS 解释器中,不能跨平台,IDE强大上手快;PHP是一种HMTL内嵌式语言,优点是开源、跨平台,缺点是安装复杂,需要添加很多的外部库来支持;JSP简单易用完全面向对象,平台无关和安全性,市场占有率高。

猜你喜欢

转载自blog.csdn.net/chenkaifang/article/details/80849152