针对java web基础系统梳理随笔录

POJO:Plain Ordinary Java Object
不含业务逻辑的java简单对象;
可以称为支持业务逻辑的协助类;
有时被称为Data对象,大量用于表现现实中的对象;
实际就是普通的JavaBeans,使用JOPO名称是为了避免和EJB混淆起来,其中主要是有一些属性及其getter setter方法的类,简单的运算属性可以,不允许出现业务方法,也不能携带有Connection之类的方法;

POJO有一些private参数作为对象的属性,然后针对每个参数定义了get()和set()方法作为直接访问的接口;

OGNL:
简单一致的表达式语法,1)可以存取对象的任意属性,2)调用对象的方法,3)遍历对象的结构图,4)实现字段类型的转换等功能,它使用表达式去存取对象的属性;
使用相同的表达式去存取对象的属性,更好的获取数据;

其有三种符号:
1)#:访问非根对象属性,#相当于ActionContext.getContext();;#session.msg表达式相当于

              ActionContext.getContext().getSession(). getAttribute(”msg”) 。    
2)%
3)$

session.setAttribute(“username”,username);
将后者的username内容放到前者username中并保存起来
方便与在其他的页面提取username的值
request.getSession().setAttribute(“key”,value);

session.getAttribute();

getAttribute() 方法返回指定属性名的属性值。

提示:如果您希望以 Attr 对象返回属性,请使用 getAttributeNode。

<%--导入标签库--%> 

<%@ taglib uri="/struts-tags" prefix=“s” %>
<%–要想使用 OGNL 表达式,需要借助 struts2 的标签–%>

在struts框架中使用EL表达式,还是要借助struts的标签;

Ognl中对java对象属性值的访问,静态和非静态方法的调用,Ognl如何处理数组、集合和Map类型的数据以及集合的投影、过滤等几个方面介绍了日常用到的OGNL知识,这是基础,但却又是最关键的东西,牢记!

Modle1思想:是只用jsp将业务逻辑处理和视图放在同一个页面;
Modle2思想:MVC思想,javabean,jsp,controllerServelt;

模型视图的练习:
编写用户注册程序:
JSP:register.jsp和loginSuccess.jsp;
Servlet:一个ControllerServelt类;
JavaBean:registerFormBean和UserBean.和一个访问数据库的辅助类DBUtil类;
RegisterFormBean是封装注册表单信息的javabean,对于ControllerServelt中获取的数据(属性)进行校验;
ControllerServelt负责用户注册请求,如果注册的结果转发到相应的jsp页面;







用户注册


两列合并为一列居中显示;
一行分为两行;

trim( )的作用是去掉字符串两端的多余的空格,注意,是两端的空格,且无论两端的空格有多少个都会去掉,当然中间的那些空格不会被去掉,如:String s = " a s f g ";

判断字符串是否为空:

name.strim().equals(“”);
name.length()==0;
前者适用于字符串的精准识别;

数据库连接池:
就是分开管理Connection,连接和断开的过程空耗资源,交给连接池统一分配,返回和回收,并交付给其他线程使用;

Servlet基础内容大纲:

  1. 掌握Servelt接口及其实现类的使用;
  2. 了解Servlet的生命周期;
  3. 熟练使用Eclipse开发Servelt;
  4. 掌握Servlet虚拟路径映射的配置;

狭义:servelt是指java语言的一个接口,处理请求和响应的一个接口;
广义:任何继承了Servlet这个接口的类,一般默认就是这种理解;

Servelt主要就是用于处理客户端浏览器传来的HTTP请求 ,并返回一个响应,它能够处理的请求有doGet(),doPost()等方法;

1.客户端
2.HTTP服务器(例如:Tomcat):静态HTML解析,对于Servelt请求转交给Servlet容器,这个容器根据web.xml文件中的映射关系,调用相应的Servlet,Servelt将相应的结果按传入的逆序返回给客户端;
3.Servlet容器:
4.Servelt

Javax.servlet.Servelt中定义了5个抽象方法;
通常情况下,编写的类都是继承自HttpServelt,在开发中使用的Servelt对象就是HttpServlet对象

Servelt的生命周期:

  1. 初始化阶段:
    请求的时候会调用init()函数,而且加载后,还是放在Servlet容器中,整个生命周期内只会被调用一次;

  2. 运行阶段:
    重点,Servlet对象会请求创建代表HTTP请求的ServletRequest对象和HTTP响应的ServletResponse对象,
    然后将他们作为参数传递给service()方法。这个方法会根据前者对象获取客户请求的信息,并处理该请求,根据后者对象生成响应结果。Servlet的每一次请求访问,Servlet容器都会调用一次Servelt的service()方法,并且创建新的请求和响应的对象。Service()方法在Servlet的整个生命周期中会被调用多次;

  3. 销毁阶段:
    服务器关闭或者web应用被移除,Servelt会随着web应用销毁而销毁,在销毁Servelt之前,会调用destroy()方法,让Servlet对象释放他所占用的资源,只会被调用一次;

Servlet的一个子元素load-on-startup:
Servlet中的程序会随着Tomcat的启动而启动,不用手动访问;如果是一个负数,就是在请求servelt时候访问,如果是一个正数或者0,就是随web应用启动而启动,越小越先加载;

学会看各类接口的源代码;
内部虚拟机运行的情况了解一下;
Eclipse会自动编译servlet,也会自动创建web.xml文件信息,完成Servlet的虚拟映射路径。
Src的目录下文件编译成class文件存放到classes目录下,web module中是可以修改的;
Context root是Web项目的根目录,存放web资源

新建的servlet中点击next可以设置接口和映射文件的信息以及最后实现的方法名;

控制类继承HttpServlet后,只需根据请求方式,重写对应方法即可,不需要重写service()方法;

采用GET方式请求Servelt时,会自动调用doGet()方法。
采用Post方式请求,一般要用表单提交的方式设置为post方法;

如果GET和POST请求处理的方式一致,则可以在doPost()中直接调用doGet();或者在doGet()中直接调用doPost();

Servlet映射的问题:

  1. servlet的多重映射;
    同一个servlet类可以用多种不同的servlet来进行访问;
  1. 配置多个
  2. 一个中配置多个元素

以上是多重映射,相应的在过滤器中,Filter中,一个地址可以实现多个servelt类的拦截;

  1. servlet映射路径中使用通配符
    需求:某个目录下,所有的路径都可以访问同一个Servlet;
    1)“.拓展名”,例如“.do”,以.do结尾的所有URL地址;
    2)“/”,例如“/abc/”,匹配以/abc开头所有的URL地址;

以上两者不能同时混用;
Tomcat安装目录下的web.xml可以处理缺省的Servlet;

ServletConfig和ServeltContext

Servlet中的编码信息被读取出来了,通过HttpServlet可以获取到ServletConfig对象,通过这个这个对象就可以访问web.xml文件中的参数信息了;

ServletContext接口;
Servlet容器启动的时候,会为每一个web应用创建一个唯一的ServletContext对象,代表当前web应用,封装了web 应用的所有信息,实现了多个Servlet之间共享。
Web.xml整合web应用的初始化信息;

在servlet的方法体中解决输出乱码问题;
resp.setContentType(“text/html;charset=UTF-8”);

通过ServletContext对象可以获取到web应用的初始化参数;

实现多个Servlet对象共享数据:
(此实验的data值没有获取到)

ServletContext对象储存的数据是可以被web目录下的servlet共享;

JDBC中常用的API:
JDBC API:用户程序接口;
主要位于java.sql包中;

JDBC是用户程序和数据库之间的桥梁,不必使用数据库厂商的接口,提高了程序的可移植性;
Driver:驱动程序必须实现的接口,提供给数据库厂商使用;注意导入*.jar

  1. Driver接口:
    这是驱动程序必须实现的接口,该接口提供给数据库厂商使用;需要把数据库驱动或者类库加载到classpath;

  2. DriverManager类:
    主要加载JDBC驱动并建立连接。在此类中有两个重要的静态方法,

  3. Connection接口:
    代表java程序和数据库相连接,只有获得该对象后才能访问数据库,并操作数据表。

  4. Statement接口:
    主要是执行静态的SQL语句,并返回一个结果对象,通过Connection获得,并把静态的sql发送到数据库编译执行,然后返回数据库的执行结果;
    提供了三个实现方法:
    Execute(String sql):执行各种sql,返回的是boolean类型值;如果是true,表示所执行的sql有查询结果,通过Statement的getResultSet()方法获得查询结果;
    ExecuteUpdate(String sql):完成增删改的sql语句,返回值是一个int值,表示数据库受到该sql语句影响的条数;
    ExecuteQuery(String sql):完成select语句,该返回对象是一个ResultSet对象;

  5. preparedStatement
    Statement中封装了JDBC中的SQL语法,可以完成java程序执行SQL语句操作;
    这个接口是,由用户传入参数(变量),完成sql语句的查询;是Statement的子类;
    Sql中可使用占位符?,然后通过set***()方法为sql中的参数赋值;也可以使用setObject()方法设置多种类型的输入参数;

ResultSet接口:
保存查询时返回的结果,该结果集封装在一个逻辑表格中,接口内部有一个指向表格数据行的游标,初始化时,位于首行之前,通过next()方法向后读取,当下一行没有数据的时候,就会返回一个false值,在while循环中常用next()方法作为循环条件来迭代ResultSet结果集;
其中定义了大量的get方法,使用哪种取决于数据类型;

以上是常用的API和其中封装的一些方法;

注意:ResultSet Statement Connection每次使用完成后都要关闭资源;

注意:导包的时候全部来自java.sql包下,通过数据库驱动conn = DriverManager.getConnection(url,name,password);创建对象的时候要抛出一个异常;

这种方式是基础,后期要做封装,不能直接这样使用,rs中存取字段的方法是根据返回字段的类型来决定;

Sql语句的执行,是通过Statement对象来实现的,Statement每次执行sql语句的时候,都会进行预编译,当相同的sql语句重复执行的时候,就会使用数据库频繁编译相同的sql,造成空耗资源的情况,降低数据库的访问效率;
解决办法:子类PrepareStatement继承了父类,有缓存区储存信息,会先在缓存区进行搜索;

此实验提示sql语法不正确?
问题解决:

PreparedStatement对象里,最后执行sql方法的时候不能加sql;

这种是加载DriverManagerDataSource对象,获取数据库基本属性值后注入JdbcTemplate对象中;

数据库连接池:

  1. DataSource接口:
    为了获取数据库连接对象,JDBC提供了javax.sql.DataSource接口,负责与数据库建立连接;
    Connection getConnection();
    Connection getConnection(String username,String password);
    这两种方法获得与数据库建立连接;

接口通常都有实现类,习惯性把这个javax.sql.DataSource接口叫做数据源,即数据的来源;就像通过指定文件名称一样,通过正确的数据源名称,可以找到相应的数据库连接;

常用的有DBCP数据源和C3P0数据源;

BasicDataSourceFactory是创建BasicDataSource对象的工厂类,它包含返回这个对象的方法createDataSource(),该方法读取配置文件的信息生成数据源对象并返回给调用者,数据库连接信息和初始化信息提取出来写进配置文件的方式,让代码看起来简洁清晰;

BasicDataSource创建了一个数据源对象,然后获取到了数据库连接对象;

BasicDataSourceFactory工厂类成功读取了配置文件并创建了数据源对象,然后连接数据库对象;

C3P0数据源:
实现了DataSource数据源接口,接口的实现类ComboPooledDataSource,是它的核心类;

这是C3P0数据源对象成功获取到数据库连接;

C3P0配置xml的时候怎么开启自动提示?
使用C3P0数据源从配置文件中获取Connection对象;

QueryRunner类:
简化了执行SQL语句的代码,与RestultSetHandler组合在一起就能完成大部分数据库操作,减少代码量;
将javax.sql.DataSource作为参数传递到QueryRunner的构造方法来获取Connection对象;提供了三种常用的方法;

ResultSetHandler接口处理ResultSet的结果集,他可以将结果集转换成不同的形式,根据结果集中数据类型不同,ResultSetHandler提供了几种常见的是实现类;

Session是一种将会话技术保存到服务器端的技术;
HttpSession API:
HttpServletRequest中定义了获取Session的getSession()的方法;
GetSession(boolean create):根据传入参数判定是否创建HttpSession对象;
GetSession():在发送响应内容之前创建;
都是返回当前请求HttpSession对象;

当客户第一次访问开启会话功能的资源时,Web服务器就会创建相应的HttpSession对象;即使关闭了客户端浏览器,这些对象仍然放在服务器内存中;
设置超时限制解决,判断服务器是否还在运行;
在Tomcat的\conf\web.xml中有如下配置:
默认会话超时间隔为30分钟;设置为0或者负数表示永不超时;

< session-timeout >30

这是会所有web应用都起作用,可以在单独的web.xml中再次进行配置;局部优先级大于整体的优先级;要想释放Session,除了等待超时,还有invalidate()方法;

来自工具类util的Map books:
这个对象采用put()方法存入泛型对象的值;
Books.put(“1”,new book(“1”,”javaweb开发”));

//返回所有的图书对象
Public static collection getAll(){
Return books.values();
}

//根据指定ID获取图书
Public static Book getId(){
Return boos.get(id);
}

服务器传递Session对象的ID属性是以Cookie的形式传递给浏览器的,如果浏览器的Cookie的功能被禁止,服务器无法通过Session保存用户的信息;

Session能够实现一次性验证码;为了保护用户信息安全,限制使用暴力软件来猜测验证码;验证码的图片来自CheckServlt类;

Session能够储存复杂的java对象;

JSP基础技术:
Jsp文件与HTML区别:
首行加了一个page指令,<%@page %>,jsp文件只有发布到web容器的web应用中才能看见;
Jsp的工作模式就是请求与响应模式:
Jsp程序收到请求后进行处理并返回处理结果,jsp文件第一次被请求,jsp引擎容器把该JSP文件转换成一个Servlet,而这个引擎本身也是一个Servelt,经过.java被编译成.class文件,生成Servlet实例;

Jsp转义编码的过程:
HttpJspBase类是HttpServlet的一个子类

JSP脚本元素是指嵌套在<%和%>之中的一条或者多条java程序代码。通过脚本元素可以将java代码嵌入HTML网页中;这里不能定义全局变量;输出内容;

<%!和%>里面定义的属性是成员属性,相当于类的属性,方法相当于全局的方法,也相当于类的方法,但是不可以进行输出,只是方法和属性的声明定义;定义成员变量属性和方法;

Jsp表达式:
<%= expression %>
“<%=” 和”%>”之前是表达式,不能插入语句;且表大式后面不能有分号;

<%–注释的信息–%>
这种格式在编译时会被忽略,不会发送到客户端;

JSP指令:
Page和include指令;

Page指令对整个页面都有效,与书写位置无关,习惯上把page写到第一行。后面属性名=”属性值”;
Include指令:
<% include file=”被包含的文件地址”%>

指定插入到JSP页面目标位置的文件资源。

插入文件路径一般不是”/”开头(这种形式表示的是当前web应用的根目录),一般使用的是相对路径;

Javax.servelt.jsp.JspWriter类的实例对象out对象和ServletResponse.getWriter()方法返回的PrintWriter对象十分相似;

Servelt引擎按照缓冲区中数据存放的顺序输出内容,只有jsp页面执行结束后,out对象中的输入缓冲区数据才真正写入到Servelt引擎提供的缓冲区;

Page指令中加入 buffer=”0kb”out对象中的输入缓冲区的数据直接写到Servelt引擎中;
PageContext对象:

Exception对象:
Java.lang.Expception类的实例对象;

JSP动作元素:

Page属性用于指定被引入资源的相对路径;flush属性是否将当前页面内容刷新到客户端,默认情况下的值为flase;


动作元素将当前请求转发到其他web应用资源(HTML JSP Servlet),转发请求执行后,当前页面不再执行,去执行指定页面;

熟悉这种直接将工具类的对象输出的方法;
System.out.println(new java.util.Date());

这种转发请求是服务器端的操作,浏览器并不知道请求的页面,所以浏览器的地址没有变化;

EL表达式和JSTL
了解什么是javaBean;
EL表达式和JSTL标签库;
BeanUtils工具;
EL中常见的隐式对象;
JSTL中常见的core对象;

JavaBean实质上就是一个普通的.java对象,但是他要符合一定的规范;

  1. 必须是公共无参的构造方法,可以是编译器自动产生的默认构造方法;
  2. 必须提供公共的getter和setter方法,让外部程序可以获取和设置JavaBean的属性。若是一个属性值只包含其中的一个方法,表示该属性值为只读或者只写属性;

如果出现属性值为Boolean,他的命名方式应该使用is/set,该属性方法声明如下;
Public boolean isMarried(){…}
Public void setMarried(boolean married){…}

Set方法的命名没变,get方法的命名变成isMarried(),这种更为符合规范;

BeanUtils工具中封装了许多类,核心是BeanUtils类;

EL表达式:
在JSP开发中,为了获取Servelt域中储存数据用java代码来写<%= expression %>的方式较为繁琐,也会造成混乱,不易维护的特点;

格式:
以${开头,以}结尾;
${表达式}

当域对象里面的值不存在时,使用EL表达式获取域对象里面的返回值为空字符串;而使用java方式获取,返回值是null时,会报空指针异常。所以在实际开发中建议使用EL表达式获取域对象中储存的数据;

EL中保留字:就是事先定义好并赋予了特殊含义的单词;

变量、常量、字符串常量、Null常量;

点运算符:访问对象的属性或者方法;
方括号运算符[]:如果是使用了特殊的符号,就需要用[]来访问属性和方法,用法同点运算符;
例: u s e r [ “ m y − n a m e ” ] 1. {user[“my-name”]} 1. user[myname]1.{user.username}等价于${user[“username”]}

  1. 方括号运算符还可以访问List集合或数组中指定索引的某个元素,如${user[0]}访问数组元素的第一个值;
  2. ${user[0].username}用于访问数组第一个元素的username属性;

算数运算符;计较运算符(得到的是boolean值);

Empty运算符:用于判断某个对象是否为null或者“”;
语法格式:${empty var}

Var变量引用集合(Set Map List)类型对象,并且在集合中没有任何元素,就返回true;

条件运算符:
${A?B:C}
A条件为true返回B的值,否则,返回C的值;

用()来控制运算各级的优先级;
EL隐式对象:

PageContext对象:

在web开发中,PageContext HttpServelt HttpSession ServletContext这四个对象之所以能储存对象,是他们内部都定义了一个Map集合,有一定的作用范围;

习惯把这些Map集合称为域;Map集合所在的对象称之为域对象;
EL表达式只能在这作用域中获取对象

JSTL:
降低页面复杂程度,提高代码的重用性,为了统一标签库,就使用JSTL;

标签库 标签库的URL 前缀
Core c
SQL Sql
XML x
Functions f
L18N fmt

core:核心标签库
:输出文本内容的标签;
:用于条件判断的标签;
:用于迭代循环的标签;

Functions:函数标签库
自定义EL函数,提取子字符串和获取字符串长度;

导入这两个包 Jstl.jar和standard.jar至lib目录下;

然后使用taglib指令导入Core标签库;

”Object[]“是定义了一个一维的对象,这个Object是任何对象的父类,也就是说可以转换成任何的类型。举例:
Object[] object = new Object[3] ;
object [0] = new String(“12312”);
object [1] = new String[] { “String1”, “String2” };
object [2] = new Date();
解释:也就是说Object类型之后可以给任意类型的值或者对象赋值给当前的object 对象,而不需要强制类型转换,方便操作。

隐式对象就是不用声明就可以直接使用的对象;

你可能感兴趣的:(针对java web基础系统梳理随笔录)