JavaWeb开发实战经典笔记

JSP基础语法
JSP注释

隐式注释:          //注释,单行注释
                         /*注释*/,多行注释
                         <%--注释--%>   JSP注释

显式注释:        客户端看得见

Scriptlet
     JSP中三种Scriptlet代码:
               第一种:<%%> :仅定义局部变量,编写语句等
               第二种:<%!%>:仅可定义全局变量,方法类(不可编写语句)
               第三种:<%=%>:输出一个变量或一个具体的常量。被称为表达式输出
     尽量不要在JSP中定义类或方法,往往会通过JavaBean的形式调用。
     尽量不要用out.println()输出,而使用表达式输出。

scriptlet标签
使用标签代替<%%>
     java scriptlet 代码

page指令(JSP开发中比较重要,可定义一个JSP页面的相关属性)
常用的几个指令

     指令属性                                                                      描述
      extends                                                  主要定义此JSP页面产生的Servlet是从哪个父类扩展而来,如extends=“父类名称”
     import                                                       此JSP页面主要导入哪几个操作包,如import=“java.util.*”
     isErrorPage                                                  可以设置为true或false,表示此页面是否为出错的处理页。设置为true出错就跳转,设置为false出错无法处理

<%@page language="java"  contentType="text/html;charset=GBK"%>
指定了要使用的开发语言是Java,然后通过contentType进行设置,本页面是按照HTML文本文件(text/html)进行显示,页面的编码(charset)是GBK

设置文件编码
page指令中也可以使用pageEncoding进行编码的指定
<%@page language="java" contentType="text/html"  pageEncoding="GBK"%>
     本页使用了pageEncoding属性,将整个页面的编码设置成GBK

错误页的设置
完成跳转错误页的操作,必须满足下面两个条件:
  指定错误出现时的跳转页,通过errorPage属性指定
   错误处理页必须有明确的标识,通过isErrorPage属性指定

会出现错误的页面   <%@page errorPage="error.jsp"%>
错误处理页error.jsp   <%@page  isErrorPage="true"%>

包含指令

静态包含:静态包含指令是在JSP编译时插入一个包含文本或代码的文件,这个包含的过程是静态的(只是简单地将内容合在一起后进行显示)
静态包含语法          <%@ include file="要包含的文件路径"%>
先把文件内容导入jsp中,然后再一起进行编译,最后将一份整体的内容展现给用户,也就属于先包含,然后再将全部的代码进行集中的编译处理

动态包含:使用指令可以完成动态包含的操作,与之前的静态包含不同,动态包含语句可以自动区分被包含的页面是静态还是动态
如果是静态,则与静态包含一样,将内容包含进来处理;而如果是动态页面,则可以先进行动态的处理,然后再将处理后的结果包含进来
不传递参数:
         
传递参数:
         
                   
                    ......可以向被包含页面中传递多个参数
         
实际开发用动态包含比较好

跳转指令
在Web中可以使用指令,将一个用户的请求(request)从一个页面传递到另外一个页面
不传递参数:
 

传递参数:
                   
                    ......可以向被包含页面中传递多个参数
         
使用此语句可以向跳转后的页面传递参数

JSP内置对象
jsp九个内置对象如下

          内置对象                                                                      描述
     pageContext                                                       JSP的页面容器
     request                                                               得到用户的请求信息
     response                                                             服务器想用户端的回应信息
     session                                                                用来保存每一个用户的信息
     application                                                          表示所有用户的共享信息
     config                                                                 服务器配置,可以取得初始化参数
     out                                                                     页面输出
     page                                                                   表示从页面中显示出来一个Servlet实例
     exception                                                            表示JSP页面所发生的异常,在错误页中才起作用

四种属性范围
     page:只在一个页面中保存属性,跳转之后无效
     request:只在一次请求中保存属性,服务器跳转后依然有效
     session:在一次会话范围中保存,无论何种跳转都可以使用,但是新开浏览器无法使用
     application:在整个服务器上保存,所有用户都可以使用

request对象
request内置对象是使用最多的一个对象,其主要作用 是接收客户端发送而来的请求信息
request是javax.servlet.http.HttpServletRequest接口的实例化对象,表示此对象主要的应用实在HTTP协议上
javax.servlet.http.HttpServletRequest接口的定义如下:
     public interface HttpServletRequest extends ServletRequest
     所以在查找request对象方法时除了要查询HttpServletRequest接口,也要查询ServletRequest接口

乱码解决:request.setCharacterEncoding("GBK");   //设置统一编码
现阶段的开发中最好每一个JSP页面都写上编码设置

接收请求参数:
     request内置对象中的getParameter()方法可以接收一个表单的文本框中输入的内容(仅适合于每次接收一个参数)
                                    getParameterValues()方法可以接收一组参数传递(复选框必须由此方法接收)

显示全部的头信息:
     想要取得头信息的名称,可以直接通过request内置对象的getHeaderNames()方法;而要想取出每一个头信息的内容,则需要使用getHeader()方法


角色验证
如果现在某些JSP页面需要输入特定的管理员的账号才能访问,那么就需要进行角色验证,而要进行角色验证就必须使用request内置对象中的isUserInRole()方法完成

response对象
response对象的主要作用是对客户端的请求进行回应,将Web服务器处理后的结果发回给客户端
response对象属于javax.servlet.http.HttpServletResponse接口的实例,HttpServletResponse接口的定义如下:
public interface HttpServletResponse  extends ServletResponse

操作Cookie
Cookie是浏览器所提供的一种技术,Cookie是服务器端保存在客户端的信息,所以其安全性也是很差的


session对象(完成用户的登陆、注销等常见功能)


application对象
尽量使用this.getServletContext()来代替application对象

Web安全性及config对象
WEB—INF是必须存在的,并且外面永远无法访问,只能通过一个映射进行操作
config对象是javax.servlet.ServletConfig接口的实例化对象,主要功能是取得一些初始化的配置信息

out对象
页面输出操作

pageContext对象
之前的request、response、config、application、等操作实际上都可以在pageContext对象中完成

JavaBean
jspBean简介
JavaBean是使用Java语言开发的一个可重用的组件,在JSP开发中可使用JavaBean减少重复代码。
JSP搭配JavaBean来使用有以下几个优点:
可将HTML和Java代码分离,这主要是为了日后维护的方便
利用JavaBean的优点。将常用到的程序写成JavaBean组件,当JSP使用时,只要调用JavaBean组件来执行用户所要的功能

在JSP中使用JavaBean
把编译好的cn.mldn.lxh.demo.SimpleBean保存在WEB—INF\classes文件夹中即可

使用JSP的page指令导入所需要的JavaBean
<%@page import="cn.mldn.lxh.demo.*"%>

使用

JavaBean与表单
JavaBean语法中最大的特点在于与表单的交互上

设置属性:

取得属性:

JavaBean的保存范围
指令上存在一个scope属性,表示一个JavaBean的保存范围。
     page
     request
     session
     application

JavaBean的删除
删除page范围的JavaBean可以使用pageContext.removeAttribute(JavaBean名称);
删除request范围的JavaBean可以使用request.removeAttribute(JavaBean名称);
删除session范围的JavaBean可以使用session.removeAttribute(JavaBean名称);
删除application范围的JavaBean可以使用application.removeAttribute(JavaBean名称);

DAO设计模式
DAO(Data Access Object,数据访问对象)的主要功能是数据操作


文件上传
SmartUpload是由www.jspsmart.com网站开发的一套上传组件包,可以轻松地实现文件的上传及下载功能
要想进行上传,则必须使用HTML中提供的file控件,而且
也必须使用enctype属性进行封装

混合表单

为上传文件自动命名
格式:IP地址+时间戳+三位随机数

FileUpload
FileUpload是Apache组织提供的免费上传组件,可以直接从Apache站点下载

FileUpload组件存在以下几点不便之处:
无法像使用request.getParameter()方法那样准确地取得提交的参数
无法像使用request.getParameterValues()那样准确地取得一组提交参数
所有的上传文件都需要进行依次的判断,才能够分别保存,不能一次性批量保存

Servlet程序开发
Servlet(服务器端小程序)是使用Java语言编写的服务器端程序,可以像JSP一样,生成动态的Web页。
Servlet主要运行在服务器端,并由服务器调用执行,是一种按照Servlet标准开发的类
Servlet带给开发人员最大的好处是它可以处理客户端传来的HTTP请求,并返回一个响应

protected  void  doGet(HttpServletRequest  req,HttpServletResponse  resp) throws  ServletException,IOException                    负责处理所有的get请求
在doGet()方法中定义了两个参数,即HttpServletRequest和HttpServletResponse,用来接收和回应用户的请求

所有的Servlet程序都是以*.class的形式存在,所以还必须在WEB—INF\web.xml文件中进行Servlet程序的映射配置

JSP是由Servlet变更推出的,它的存在是和Servlet起互补作用

每一个Servlet实际上都可以配置多个名称,只需要增加对应的元素即可

Servlet与表单
由于servlet本身也存在HttpServletRequest和HttpServletResponse对象的声明,所以也可以使用Servlet接收用户所提交的内容

Servlet生命周期
Servlet程序是运行在服务器端的一端Java沉痼,其生命周期将受到Web容器的控制。生命周期包括加载程序、初始化、服务、销毁、卸载5个部分

加载Servlet
Web容器负责加载Servlet,当Web容器启动时或者是在第一次使用这个Servlet时,容器会负责创建Servlet实例,但是用户必须通过部署描述符(web.xml)指定Servlet的位置(Servlet所在的包.类名称),成功加载后,Web容器会通过反射的方式对Servlet进行实例化。

初始化
当一个Servlet被实例化后,容器将调用init()方法初始化这个对象,初始化的目的是为了让Servlet对象在处理客户端请求前完成一些初始化的工作,如建立数据库连接、读取资源文件信息等,如果初始化失败,则此Servlet将被直接卸载

处理服务
当有请求提交时,Servlet将调用service()方法(常用的是doGet()或doPost())进行处理
在service()方法中,Servlet可以通过ServletRequest接收客户端的请求,也可以利用ServletResponse设置响应信息

销毁
当Web容器关闭或者检测到一个Servlet要从容器中被删除时,会自动调用destroy()方法,以便让该实例释放掉所占有的资源

卸载
当一个Servlet调用完destroy()方法后,此实例将等待被垃圾收集器所回收,如果需要再次使用此Servlet时,会重新调用init()方法初始化

取得初始化配置信息
通过config对象可以读取web.xml中配置的初始化参数,此对象实际上是ServletConfig接口的实例

取得其他内置对象
使用Servlet可以取得request、response、config、session及application的内置对象

Servlet跳转
从一个JSP或者是一个HTML页面可以通过表单或超链接跳转进Servlet,那么从Servlet也可以跳转到其他的Servlet、JSP或其他页面

客户端跳转:直接使用HttpServletResponse接口的sendRedirect()方法即可。此方法只能传递session及application范围的属性

服务器端跳转
Servlet中没有像JSP中的指令,所以,如果要想执行服务器端跳转,就必须依靠RequestDispatcher接口完成
                         方法                                                                                                                                                                                         描述
       public void  forward(ServletRequest  request,ServletResponse  response)throws  ServletException,IOException                                        页面跳转
       public void  include(ServletRequest  request,ServletResponse  response) thirows  ServletException,IOException                                        页面包含

过滤器
jsp可以完成的功能Servlet都可以完成,但是Servlet具备的很多功能是JSP所不具备的
从使用上看Servlet可以分为简单Servlet、过滤Servlet(过滤器)和监听Servlet(监听器)三种

过滤器的基本概念
Filter是在Servlet2.3之后增加的新功能,当需要限制用户访问某些资源或者在处理请求时提前处理某些资源时,即可使用过滤器完成。

实现过滤器
Servlet中要定义一个过滤器,则直接让一个类实现javax.servlet.Filter接口即可,此接口定义了三个操作方法。
init   过滤器初始化时候调用,可以通过FilterConfig取得配置的初始化参数
doFilter  完成具体的过滤操作,然后通过FilterChain让请求继续向下传递
destroy     过滤器销毁时使用

过滤器的应用
过滤器本身是属于一个组件的形式加入到应用程序之中的。例如,可以使用过滤器完成编码的过滤操作或者是用户的登陆验证

监听器
主要功能是负责监听Web的各种操作,当相关事件触发后将产生事件,并对此事件进行处理

表达式语言
使用表达式语言可以方便地访问标志位(在JSP中一共提供了page(pageContext)、request、session和application 4 中标志位)中的属性内容,这样就可以避免出现许多的Scriptlet代码
简便语法如下:
 ${属性名称}

使用表达式语言额可以方便地访问对象中的属性、提交的参数或者是进行各种数学运算,而且使用表达式语言最大的特点是如果输出的内容为null,则会自动使用空字符串("")表示

表达式语言的内置对象
表达式语言的主要功能就是进行内容的显示
在表达式语言中提供了许多的内置对象,通过对不同内置对象的设置,表达式语言可以输出不同的内容

表达式共有10个内置对象

访问四种属性范围的内容
使用表达式语言可以输出四种属性范围中的内容,如果此时在不同的属性范围中设置了同一个属性名称,则将按照如下顺序查找:
          page->request->session->application

调用内置对象操作
在讲解JSP内置对象时就就曾介绍过pageContext内置对象的作用,使用pageContext对象可以取得request、session、application的实例,所以在
表达式语言中,可以通过pageContext这个表达式的内置对象调用JSP内置对象中提供的方法
表达式语言中更多的是利用了反射的操作机制

接收请求参数
使用表达式语言还可以显示接收的请求参数,功能与request.getParameter()类似,语法如下:
${param.参数名称}
接收一组参数:
${paramValues.参数名称}

集合操作
集合操作在开发中被广泛地采用,在表达式语言中也已经很好地支持了集合的操作,可以方便地使用表达式语言输出Collection(子接口:List、Set)、Map集合中的内容
表达式语言的强大功能还在于可以直接通过反射的方式调用保存在属性范围中的Java对象内容

运算符
表达式语言中为了方便用户的显示操作定义了许多算术运算符、关系运算符、逻辑运算符等,使用这些运算符将使得JSP页面更加简洁,但是对于太复杂的操作还是应该在Servlet或JavaBean中完成。
在使用这些运算符是,所有的操作内容也可以直接使用设置的属性,而不用考虑转型的问题

Tomcat数据源
JDBC操作原理:加载数据库驱动程序,数据库驱动程序通过classpath配置
                         通过DriverManager类取得数据库连接对象
                         通过Connection实例化PreparedStatement对象,编写SQL命令操作数据库
                         数据库属于资源操作,操作完成后要关闭数据库以释放资源

数据源操作的核心原理是,在一个对象池中保存多个数据库的连接(也称之为数据库连接池),这样以后再进行数据库操作时,直接从连接池中取出一个数据库连接,当数据库操作完成后,
再将此连接放回到数据库连接池中,等待其他用户继续使用

在Tomcat中使用数据库连接池
在Web容器中,数据库的连接池都是通过数据源(javax.sql.DataSource)访问的,即可以通过javax.sql.DataSource类取得一个Connection对象
但是要想得到一个DataSource对象需要使用JNDI进行查找

查找数据源
数据源的操作使用的是JNDI方式进行查找的,所以如果使用数据源取得数据库连接,则必须按照如下步骤进行:
初始化名称查找上下文:Context ctx  =new   InitialContext();
通过名称查找DataSource对象:DataSource  ds  = (DataSource)ctx.lookup(JNDI名称);
通过DataSource取得一个数据库来连接:Connection  conn  = ds.getConnection();

JSP标签编程
jsp开发是在HTML代码中嵌入大量的Java代码,过多的Scriptlet代码回导致程序修改困难
标签库编程的主要目的就是为了减少页面中的Scriptlet代码,使程序更加便于理解和修改

JSP标签库(也称自定义标签库),是使用XML语法格式完成程序操作的一种方法,其使用的形式类似于JavaBean的使用语法“”.与JavaBean一样都可以将大量的复杂操作写在
类中完成,而且最大的优势是按照HTML标签的形式表现,这样可以方便地处理JSP页面的数据显示

定义有属性的标签
语句中可以通过page属性指定一个跳转路径,实际在使用自定义标签时用户也可以定义属性,例如,要开发一个格式化日期显示的标签,则用户就需要通过属性指定格式化日期的格式

TagSupport类
基本的标签掌握后,可以发现标签的实现都需要继承TagSupport这个类,所以TagSupport类是整个标签编程的一个核心类
此类定义如下:
     public class TagSupport  extends  Object  implements  IterationTag,Serializable

JSP标准标签库
JSTL是一个开源的标签库组件,可以直接用于JSP页面的编写
标签库的核心操作原理依然是利用了4种属性范围
使用核心标签库可以完成一些基本的程序判断、迭代输出功能
通过I18N标签库可以对显示进行格式化的操作
SQL标签库的主要功能是进行数据库的操作

Ajax开发技术
主要完成页面的局部刷新,实现方式会使程序的性能更高

Ajax是一门综合性的技术,其主要应用包含了HTML、JavaScript、XML、DOM、XMLHttpRequest等页面技术,但是这之中最重要的是XMLHttpRequest对象

XMLHttpRequest对象
Ajax中主要是通过XMLHttpRequest对象处理发送异步请求和回应的

Struts基础开发
struts产生的原因:使用MVC设计模式可以使JSP、JavaBean和Srvlet3层的分工明确,适合多人开发,但这种开发模式要花费大量设计时间
Struts是较为著名的MVC实现框架

Struts中有自己的控制器(ActionServlet),同时也提供了各种常用的页面标签库以减少JSP页面中的Scriptlet代码

*.do是一个著名的标志
一般看到提交路径是以此种形式表示的基本上都属于Struts开发的项目

在Struts中所有的TLD文件都保存在了WEB-INF\lib\struts-taglib-1.3.10.jar文件中

标签的主要作用就是输出全部的错误

Struts工作原理
Struts完整工作流程:
1、在web.xml中为ActionServlet配置一个映射路径,一般都为*.do
2、当一个JSP页面执行时,如果使用的是HTML标签定义的表单,则会根据action制定的路径与struts—config.xml文件中的路径相匹配,如果匹配失败,则程序报错
3、在运行一个JSP页面前,会调用指定ActionForm中的reset()方法,进行表单元素的初始化操作
4、用户提交表单时会将所有的操作都提交到ActionServlet(有*.do指定)中,之后由ActionServlet根据struts—config.xml文件中的配置调用指定的ActionForm和Action进行处理
5、表单提交的数据首先会交给ActionForm处理,并自动调用其中的validata()方法进行验证,如果验证成功(validata()方法返回为null或者ActionErrors中没有任何内容),
     则交给相应的Action进行处理;如果验证失败,则跳转到提交Action中配置的input属性中指定的页面路径,此时可以通过标签显示所有的错误信息
6、Action负责完成具体的业务操作(如调用DAO操作),并根据操作的结果通过ActionMapping进行跳转,ActionMapping的findForward()方法返回一个ActionForward对象
     以完成跳转

Struts中最主要的有5种类
ActionServlet:处理用户请求的Servlet,并根据请求加载对应的Action
ActionErrors、ActionMessages、ActionMessage:保存所有错误信息,可以通过标签进行输出
ActionForm:接受所有请求参数,并执行请求参数的验证
ActionMapping:通过此类的findForward()方法找到struts—config.xml文件中配置的跳转路径(
ActionForward:执行Action跳转的操作类,通过ActionMapping类的findForward()方法实例化

Struts是MVC框架的一种实现,通过Struts的ActionForm可以完成数据的验证,通过Action可以完成与Servlet一样的功能
Struts的所有请求都是通过*.do的路径提交到相应的Action上去的,所有的Action都需要在struts-config.xml文件中进行配置
在Struts中所有的资源信息都是通过ApplicationResource.properties文件进行配置的

Struts常用标签库
在Struts中一共提供了4种标签
                         标签库                                                                                               描述
                    Bean标签                                                                                     管理JSP页面中的Bean操作
                    Logic标签                                                                                     完成各种逻辑控制操作
                    Html标签                                                                                     显示标签,主要是生成HTML标记
                    TILES标签                                                                                     使用动态模板构造显示页面
                    NESTED                                                                                       使用嵌套标签进行复杂的页面显示

Bean标签
Bean标签库的主要作用是定义和访问JavaBean,在Struts中提供了多种标签用于处理JavaBean,这些标签都定义在struts—bean.tld文件中

标签的主要功能是定义新的JavaBean对象或复制现有的JavaBean对象
标签的主要作用是获得数组、Collection、Map的长度
资源访问标签:     Struts的标签可以访问多种资源,如Cookie、HTTP头信息、请求参数等。
标签与标签的功能类似,主要是用于输出Bean的内容
标签作用是将一个资源包含在本页面中。语法如下 :
                         
标签可以将需要的Web资源引入。语法如下:
                         
国际化与标签:Struts本身就支持国际化程序的开发操作,用户只需要根据区域的不同配置不同语言的资源文件(资源文件是通过struts-config.xml指定的,此处为 ApplicationResource.properties),  即可显示不同的区域
 
Logic标签                  
Login标签的主要作用都是进行各种逻辑处理,如执行分支语句、迭代、比较等操作,所有的Logic标签都定义在struts-logic.tld文件中
标签:判断数据是否存在,如属性是否存在、传递的参数是否存在等
 标签:判断一个属性书否为null,或者判断一个集合的长度是否为0
 标签:迭代输出是JSP中的主要功能,在Struts中也专门为此功能提供了标签,可用于输出对象数组、Collection集合、Map集合等
 重定向标签:标签可以完成页面的重定向操作,根据指定不同的属性,可以完成不同方式的重定向操作,还可以指定重定向页面的参数

Html标签
Html标签主要用于页面的显示,如之前的等都属于页面显示,这些标签都与ActionForm紧密绑定,所有的Html标签都定义在struts-html.tld文件中

标签的功能与元素是一样的,在此标签中可以包含多个等标签,在编写标签时必须与一个ActionForm
                    及Action相对应
标签表示的是文本输入框和密码输入框
标签表示单选按钮
标签用于大文本输入
标签主要功能是完成复选框的操作
标签可以制作下拉列表框

Bean标签库可以进行JavaBean或者是资源的操作
Logic标签主要完成的是判断、比较等功能的实现
Html标签库中定义了许多与显示有关的标签,但是这些标签要运行则依赖于ActionForm

Struts高级开发

Token
Token主要是以一种指令牌的形式进行重复提交处理的,如果用户对同一个表单进行了多次提交,则可能造成混乱,Web服务器必须可以对这种重复提交的行为作出处理
Token原理:在进入到注册页之前,先通过session设置一个属性(假设设置的属性是flag,内容是true),当用户进行用户注册时,首先判断这个session中的属性是否合法
                    (如flag=true表示合法),如果合法,则进行正确的注册操作,操作完成后,将session的相应属性修改(如flag=false),这样用户就无法再次进行提交;如果session中
                    的属性非法,则要进行相应的错误提示,并且不再执行注册的具体操作

文件上传
使用标签完成,此标签的核心语法如下:
                         

动态ActionForm
在正常操作下,每一个Action必须对应一个ActionForm,但是这样一来就会造成ActionForm过多,所有为了解决此类问题,在Struts中专门提供了动态ActionForm,已解决ActionForm过多的问题

动态ActionForm对应的操作类是org.apache.struts.action.DynaActionForm,在使用此类时,不需要定义具体的类,只需要在struts-config.xml文件中配置即可

Action深入
在Struts中Action属于一个核心的功能操作类,但是在Struts中并不只是定义了一个普通的Action,还包含了IncludeAction、ForwardAction、DispatchAction等各种常见的Action



































































































































































































































































































你可能感兴趣的:(Java后台)