静态网页
动态网页CGI asp(html+JavaScript+com组件) PHP
jsp(html+java片段+jsp语法+js)在servlet基础上发展的
B/S开发模式(browser/server)浏览器→服务器
C/S开发模式(client/server)客户端→服务器
html:行内元素 独占一行 块级元素
target= _blank新建选项卡打开 _self当前选项卡打开
在frameset中,可以给target指定一个frame的name
display改变元素的样式
CSS层叠样式表
常用的选择器:
标签选择器父子选择器class类选择器(.) ID选择器(以#开头) 通配符选择器(*)
浮动float
JavaScript:解释性语言 是基于对象和事件驱动
广泛用于客户端的web开发的脚本语言,常给html添加动态功能
没有class(类)
var Fish = new Fish()当做类使用
数字类型布尔类型字符串类型(使用引号)
false 0 “”null undefined NaN都表示false。
null:变量的值为null/赋值为null
undefined:变量没有值/声明了变量,没有赋值
算术运算:
推断:refer
当if遇到||运算时 从前向后运算 遇到真的时候返回真的对象 当没有真 就返回最后一个为假的对象
var input = window.prompt();
window.alert();
document.write();
强转parseInt();变整型
JS中,函数/方法定义的时候,形参不需要var
数组:foreach: Java中遍历的是元素 JS中是下标 用in替代:
数组中的键值对只能遍历出来
函数:自定义函数系统函数
调函数只看函数名
function函数调用时可直接赋参数
用arguments可以for循环出赋予的参数(arguments里存放了通过参数传来的参数值)
重载:无重载后面的会覆盖前面的
定义类(原型对象)和对象:
没有类的概念,类怎么来?创建对象实例可通过构造函数实现
function Car(){}
var c = new Car();
1、①动态绑定属性 c.name=””;②动态绑定方法 c.run = function(){}
2、有参构造方法中 动态绑定 用 this.替换上面的c. 不用this用var 是私有的
即在JS中 被this修饰的都是公开的 否则为私有
静态绑定Car.prototype.属性或方法 所有对象都拥有了这些属性和方法
Array直接new 直接放
JSON一种简洁的方式创建一个对象 var car = {:,:,}
①var str = '{"name":"huangxiaojian","age":"23"}'
JSON.parse(str) age: "23" name: "huangxiaojian"
②var a = {a:1,b:2}
JSON.stringify(a) "{"a":1,"b":2}"
封装
继承:①使用对象冒充的方式实现继承 多继承 多重继承
this.xx =父名;
this.xx();
②原型链:上面所示的静态绑定。
多态无态的
JS内建对象
Object对象.constructor,返回代码 Math Date String Array Boolean Number
系统函数
URL:统一资源定位
URI:统一资源标识符
都能表示网络资源但前者可以获取资源
eval();
JS事件驱动机制
document.getElementById(“id号”);
-c→ C
DOM
删除p标签:先获取父节点 再删除子节点
onsubmit询问是否提交表单
window.setInterval(“方法”,毫秒) 每隔多少毫秒 调用一次方法
open(“网站”, “_self”)不新建的打开网站
span.innerText
History列表
Location对象
Navigator对象
Screen对象
Event对象 事件
Document对象常用函数
document.createElement(“a”)创建一个标签
了解:Tomcat WebSphere WebLogic
Tomcat:入门级服务器,支持JSP Servlet
WebSphere: IBM专业级应用服务器,支持JSP Servlet 数据库连接池管理 EJB容器等
WebLogic:世界第一应用服务器,支持数据库连接池 EJB容器 集群管理
Servlet与CGI(通用网关接口)的区别
Servlet是通过多线程的方法运行service的,一个实例服务于多个请求,实例一般不销毁。CGI是每次请求都会创建新的进程,服务完后就销毁
接收、处理、响应
Servlet:
servlet在Web服务器的运行过程:装入→→初始化→→调用→→销毁
主要体现在:init()service()destory()
加载和实例化:Servlet容器负责加载和实例化Servlet
1、初始化:init() 读取配置信息、初始化参数等,在Servlet生命周期中只执行一次。
2、调用:service() ServletRequest请求对象和ServletResponse响应对象, 此外还可调用doGet()、doPost()方法来处理请求。
3、销毁:destory() 在Servlet生命周期中只执行一次,结束时。
配置:
1、创建一个java工程
2、搭建javaweb框架
①在项目里面创建一个文件夹webroot
②在webroot中创建WEB-INF的文件夹
③在WEB-INF中创建classes和lib
3、修改项目的编译路径(把以前编译到bin目录改为WEB-INF下的classes目录)
右键工程文件,build-path,进去选source 选择classes,classes会消失
4、从服务器的根路径中找到lib,然后再从lib中找到servlet-api.jar
拷贝到WEB-INF下的lib中,然后在该文件上右键 选择build-path →add to build
5、从服务器根目录中找到webapps,打开找到root,在找到WEB-INF 把其中的web.xml拷贝到WEB-INF目录下。
6、在web.xml文件夹中配置外界访问的servlet,添加如下代码:
thing//thing链接下面的thing
/nice//nice是将来浏览器访问的字符串
thing
ServletText//ServletText是src下的全限定名
7、告诉服务器要到指定的目录去自动部署项目,找到服务器根目录中的conf中的server.xml
在Host标签之间添加如下代码:
path中放的是上下文路径 可忽略
8、访问:http://ip:port/上下文路径/资源名称(就是是哪个面的nice)
//给用户访问资源提供接口
<servlet-name>ming
/search 可以直接写多个
//根据名称找到具体的服务类
HTTPServlet类:专门处理HTML表单(FROM),不必重写父类的init()方法和destory()方法。
缺省的service()方法可以调用与HTTP请求方式相应的doXxx()功能。
get方法:数据量小、没有安全性考虑 post方法:数据量大 有安全放面考虑
当服务器调用Servlet的service() doGet() doPost()方法时,均需要请求和响应对象作为参数。
GET POST请求参数的乱码:字符流两次修改编码 字节流一次
响应页面的乱码
一:请求参数的乱码
GET:根据本来的编码(ISO-8859-1)获取其字节数组,再把字节数组按照我们的编码(UTF-8)来编码
POST:同样拥有GET的方式; 设置request.setCharactorEncoding("你的编码");
二:响应页面的乱码
GET POST:
1):字节流
①:我们自己要用给浏览器传输什么编码的数据(如:utf-8)
②:告诉浏览器使用什么编码解析数据(要和上面的utf-8一致)
2):字符流
①:我们自己要用给浏览器传输什么编码的数据(如:utf-8)
action:填写提交的URI
Cookie:一种用于保留用户操作信息的客户端技术
步骤:new一个cookie ,添加到响应里去
set-cookie和cookie 原理
更新cookie
cookie.setPath(“/”); cookie.setDomain();
编码URLEncoder
解码URLDecoder
Session:一种用于保留用户操作信息的服务端技术
服务器创建session:服务器把创建好的一个对象的地址映射成id,把默认id通过cookie传递给浏览器
session不传输,在服务器内存中开辟空间存放
步骤:请求获取session,设置session
只需要创建并设置值即可,不需要添加响应中,会自动添加session对象的地址映射id到本次请求的响应头中
销毁session和移除session中的属性
获取session看其是否有值来判断需不需要登录
Servlet页面间对象传递的方式:request、cookie、session、application
注解
1、@webServlet(“/annotation”) 相当于
多参数:@webServlet(
urlPatterns={“/annotation1”,“/annotation2”}, initParams=@webinitParams{name = ”users”, value = “gyvsxy”}
)
2、在web.xml中将metadata-complete改为false,意味不忽略注解
ServletContext全局应用程序: 全局只有一个Servlet对象。
web.xml中设置
ServletContext和ServletConfig对比:前者全局应用对象,后者表示Servlet的初始化参数。
URL重定向 :在服务端让浏览器重新跳到指定的页面
用法:resp.sendRedirect(url);注意: / 当前路径
重定向不能访问WEB-INF下的文件.
请求转发:浏览器请求一个Servlet里的转发给另一个Servlet
用法:req.getRequestDispatcher("url").forward(req, resp);
URL重定向和请求转发:前者改变地址栏地址,可跨域;后者不变,可以访问WEB-INF下的文件,不可跨域
Servlet三大作用域对象:共享数据
ServletContext
Httpsession
HTTPServletRequest
作用域越来越小
JSP:
xx.jsp→在web.xml找jsp对应的处理类→JSPservlet源程序→xx_jsp.java→xx_jsp.class→返回
xx_jsp→HttpJspBase→HttpServlet(都是继承)
JSP注释是隐式注释和HTML注释不同的是:前者不会被发送到客户端
JSP的java代码片段和java代码表达式=和全局代码片段!
九大内置对象四大作用域
request:客户端请求,包含GET/POST请求的参数。
response:传给客户端的响应
session:与用户请求相关的对象,用于保存该用户的信息,跟踪用户的操作状态。
application:Servlet中正在执行的内容,一直存在到服务器关闭。
out:用来传送响应的输出
pagecontext:管理网页的属性
config:取得服务器的配置信息
page:JSP页面本身
exception:针对错误页面,没有被捕捉的异常就会生成此对象
JSP、Servlet的异同:都可以加载成.class文件,JSP的本质就是一个Servlet,不同点:一个用于前端,一个用于后台
EL
语法:${}
作用:获取作用域中的共享数据
注:依次从pageContext,request,session,application(由小到大)
EL获取指定作用域:${requestScope.}
找不到返回空字符串与findAttribute的不同点
${param.key}对应getParameter
EL访问对象
注:属性(property)=字段(field)+getset方法
${对象.属性}
set/getAttribute设置获取作用域的值 findAttribute依次寻找
getParameter获取请求参数中的值
JSTL:JSP Standard Tag Library 即JSP标准标签库
作用:替代java的逻辑操作代码
用法:先导入taglib指令
单条件判断
<% %>
多条件匹配
<% %>
循环
<%循环体%>${}
foreach
<% %>${}
格式化日期:
<%%>
分页
自定义(pageCount pageSize)
过滤器过滤请求
接口Filter
name
/* 或者/xxx/*
根据请求类型过滤
较好用函数:
JS:
confirm():如果用户点击确定按钮,则confirm()返回 true。如果点击取消按钮,则 confirm() 返回 false。
Struts2
基于MVC设计模式的轻量级JavaEE框架,本质上相当于一个Servlet(控制层)
原生mvc模式使用jsp+javabean+servlet来实现。jsp充当v,javabean充当m,servlet充当c。
作为控制器来建立模型和视图的数据交互
基于拦截器
运行原理:客户端发送请求经过核心过滤器,然后询问ActionMapper需要调用哪个Action,如果需要,核心过滤器会把请求交给ActionProxy代理,代理通过配置管理器加载Struts.xml文件,找需要调用的Action类,ActionProxy会创建Action类的实例,调用对应的方法,在调用之前依次调用所有配置的拦截器,执行完Action返回字符串,实例会根据字符串查Result,再经过所有配置的拦截器返回响应,响应经过核心过滤器返回给客户端。
DTD获取本地xml提示 需联网 如果没网需手动配置本地DTD
Struts2配置常量(如编码集、扩展名、开发模式、动态方法调用)有三种方式:
①struts.xml中的②struts.properties中③web.xml的
###是properties的注释信息
核心组件:Action和拦截器
包配置: name唯一 默认struts-default,这样该包中的action就具有了Struts2默认的拦截器等功能。 抽象包不能写action
包含配置:
实现Action控制类的三种方式:
①直接写类名(POJO)②继承ActionSupport③实现Action接口
配置Action:
不写method会根据反射执行execute方法
写方法调用方法
写action的三种方法:
直接写
通配符法: 1表示从第一个*开始 *→方法名
动态方法调用:常量配置里默认关闭动态方法调用
的name可用在form表单的action
下的 全局的
标签的type属性值默认是dispatcher,实际上就是转发
访问Servlet API
①ActionContext.getContext() 分别可用在request、application、session
②通过特定接口ServletRequestAware ServletResponseAware 等
③通过ServletActionContext访问
Action处理请求参数
①属性驱动:只需set 把表单的name作为属性 getset方法
②对象驱动 必须set和get 新建类
集合驱动
③实现模型驱动
ServletActionContext封装了以前的servlet
数据校验
重写validate方法中加
if(){this.addFielderror(键值)}
s标签 s:fielderror fieldname=””
避免重复提交
XML配置方式数据校验
XML名字:Action类名-validation.xml 与Action类在同一个包下
资源文件
①针对action类
与action在同一个包下
名称:ActionClassName.properties这个配置文件只对当前action有用
②针对包下的所有action package.properties
this.getText
③struts.properties 全局
拦截器
自定义拦截器实现interceptor
需要在struts.xml中
在package中
//系统的
如果在中设置方法名 忽略拦截方法
通过配置的形式向拦截其中传递参数
param参数会在启动服务器时把其中的参数name通过对应的setter方法传递到拦截器中
设置默认拦截器只能有一个
下面的action都可以被拦截
给action单独用拦截器
在action中加
action之间的传递参数
redirect和chain
注解:单个@XXX(“”)多个@XXXS({@xx(“”),@xx(“”)})
JSON
{“key”:”value”,”key2”:”value2”}[{},{}]
JS中加入 $.ajax({})
不跳转页面请求数据
Listener监听器
实现HttpSessionListener ServletContextListener RequestListener等等
设置配置
防止表单重复提交
token字符串 每请求一次都会生成一个字符串 可放在 session、隐藏域
避免表单用户输入乱码
req.setCharacterEncoding(“”);
JavaEE三层:表现层、业务层、持久层
前端控制器:过滤器栈
值栈
用来管理请求数据
生命周期就是一次请求
由root和 Context组成
OGNL对象图形导航语言
替换EL的
Struts2用OGNL作为默认的表达式语言
OGNL是基于ValueStack数据结构
获取root中的数据
①对象.getRoot().push(值)
②对象.set(键值)
③private String val=”123”; public String getVal(){return val;}
获取context中的数据
凡是写在context中的数据 前面要加# 便于维护
①对象.getContext().put(键值)
②context.put(键值)
校验
validate()对应
如果不通过就执行input如果通过 就执行execute的success
标签
国际化
上传下载
上传:①上传的表单以POST方式 ②提交需要指定编码为:multipart/from-data;
标签
不需要再去填写contextPath
多选框
取setAttribute的值
Hibernate
是一个面向对象的持久化框架
hibernate.cfg.xml
//连接数据库
true
采用getCurrentSession()创建的Session会绑定到当前的线程中去、而采用OpenSession()则不会。
采用getCurrentSession()创建的Session在commit或rollback后会自动关闭,采用OpenSession()必须手动关闭。
采用getCurrentSession()需要在Hibernate.cfg.xml配置文件中加入如下配置:
如果是本地事物,及JDBC一个数据库:
thread
如果是全局事物,及jta事物、多个数据库资源或事物资源:
jta
类和表的映射配置文件:
xx.hbm.xml
//id是类中的属性 column是表中的字段
//设置主键
Transaction对事物的封装
save方法的执行流程
1、新建一个configuration对象
2、利用方法configuration.configure()加载hibernate.cfg.xml
3、根据xml中的连接数据库的信息连接数据库,并配置相关的property属性
4、加载解析映射文件,把映射文件的信息保存在configuration对象中
5、根据config创建sessionfactory对象,并创建session对象
6、执行保存事件
saveOrUpdate()方法
persist()持久化 JPA规范里面的 与save()有点相同
merge()与update()有点相同
load()与get() load()动态的新建一个类:
Student stu =(Student) session.load(Student.Class, 3);多态
load():延迟加载 load()方法返回的是一个代理(代理只有一个ID),只有等真正使用该对象属性的时候才会发出sql语句
如果数据库中没有对应的记录,get()方法返回的是null.而load()方法出现异常ObjectNotFoundException
一级缓存
缓存:提高效率
在hibernate.cfg.xml中的
#hibernate.hbm2ddl.auto none/create/create-drop/update/validate
mapping文件获取属性是反射:反射不关心访问权限
OID:对象中对应数据表的主键的属性
自然主键(使用对象本身的属性作为主键)代理主键(序号)
主键生成策略:
assigned:手动设置主键
uuid:hibernate帮忙生成的
increment:查最大id然后加1
identity:数据库需支持自增
native:使用数据库支持的生成主键方式
持久化对象的状态
有没有被管理有没有id数据库中有没有值
瞬时态
持久态
脱管态
提交之前,delete之后,数据处于计划删除
session管理对象的状态 事务负责提交数据操作
事务处理方式(当多个事务同时访问数据库中的相同数据)
悲观锁:在每次操作数据时,悲观的认为会有其他事务来操作同一数据。加锁(数据库层次)
乐观锁:认为许多事务同时操作同一数据的情况很少发生。数据版本标识锁定机制(非库层次)
对象的关系
依赖关系
关联关系
聚合关系
组合关系
关联关系:一对多多对一多对多
多对一:
在多中:设置一的私有属性
一对多:
set:
在一中:Set<> = new HashSet<>();
在一的xml中
list:
反转操作:
在双向关联中,一方的中加入inverse=”true”可以反转维护关系,即此方放弃对另一端关系的维护,而由对方来维护关系
一对多多对一双向:
删除时注意set里的inverse为false
cascade级联删除:save-update、delete、all、delete-orphan、all-delete-orphan
一对一:先保存xx
多对多:两个set
注意中间表的主键重复需要把一个主键设置为
组件映射
SQL
HQL
Criteria
分页
HQL不支持 limit关键字
query.setFirstResult()
query.setMaxResults()
位置占位符?
名称占位符:xxx
Collection
query.uniqueResult()返回个数
SELECT NEW LIST(XX,XX,XX) FROM
SELECT NEW MAP(XX,XX,XX) FROM
session.getNameQuery()
主要是为了一些经常使用,在类的映射文件中添加一个标签“query”,属性name来指这个NameQuery的名字,在XML的innerText中写HQL语句
Spring
面向接口编程解耦
IoC/DI控制反转 依赖注入
IoC控制反转:说的是创建对象实例的控制权从代码控制剥离到IoC容器控制,实际就是你在xml文件控制,侧重于原理。
DI依赖注入:说的是创建对象实例时,为这个对象注入属性值或其它对象实例,侧重于实现。
IoC是目的,di是手段。IoC是指让生成类的方式由传统方式(new)反过来,既程序员不调用new,需要类的时候由框架注入(DI),是同一件不同层面的解读。
Bean:放在Spring容器中的对象
bean中的属性:
id: bean的全局唯一标识
lazy-init=”true/false”告诉容器,不要在容器启动的时候实例化bean
bean的作用域 scope=””
singleton单例模式对于无会话状态的bean(Dao、Service)来说是最理想的选择
prototype原型类型,每次都会创建个新的对象 适合需要保持会话状态的bean(struts2的action)
bean的生命周期
singleton作用域下的bean的声明周期受spring容器的管理,
prototype作用域下的bean,容器只负责创建,管理交给客户端代码
bean里面的constructor-arg:可传入构造参数 index type ref value
bean里面的property 用于调用bean实例中的setter方法
name和value name有对应的属性,不是随便写
name和ref ref=”xx”:是把id为xx的bean传过来
在面向对象的程序中,想要使用某个对象,就需要先实例化这个对象
bean的实例化方法:
1、构造器实例化 通过实现类的默认无参构造器对bean进行实例化 传统bean的配置方式
2、静态工厂方法生产bean class属性为对应的工厂实现类 factory-method
3、实例工厂方法 建立工厂bean,再通过factory-bean建调用工厂bean的bean,再通过factory-method指定实例化bean的方法
AOP
所有事务从Dao剥离,放在service层
静态代理
动态代理:
①通过实现接口的方式 代理类是对dao实现类的增强
Handler implements invocationHandler proxy.newProxyInstance
public Object invoke(Object proxy, Method method, Object[] args)
method.invoke(obj, args);
proxy:代理方法调用的代理实例
method:
②通过继承的方式Enhancer
cglib javassist:代码生成的库
AOP的xml和注解Annotation
xml
Annotation: point连贯方法
AOP:在某些事情即将发生的时候做某些事
XML
解析方式:DOM解析:把整个XML文件加载进内存进行解析
SAX解析:通过流的形式一行行解析
xmlns:xmlnamespace
dtd和schema的后缀xsd
SpringMVC
分离了控制器,模型对象,分派器,处理程序对象角色
DispatcherServlet:前端控制器,用于接收请求。
HandlerMapping接口:用于处理请求的映射。
DefaultAnnotationHandlerMapping:HandlerMapping接口的实现,用于把一个URL映射到具体的Controller类上。
HandlerAdapter接口:用于处理请求的映射。
AnnotationMethodHandlerAdapter:HandlerAdapter接口的试下,用于把一个URL映射到对应Controller类的某个方法上。
ViewResolver接口:用于解析View。
InternalResourceViewResolver:ViewResolver接口的实现,用于把ModelAndView的逻辑视图名解析为具体的View。
加载优先级
在xml配置了这个标签后,spring可以自动去扫描base-pack下面或者子包下面的Java文件,如果扫描到有@Component @Controller@Service等这些注解的类,则把这些类注册为bean
MyBatis(非标准的ORM框架)基于JDBC
做数据持久化(其他三种:流JDBC Hibernate(Hibernate是标准的对象关系映射ORM))
标准的ORM框架:
实现:
连接数据库:SqlSessionFactoryBuilder Reader SqlSessionFactory SqlSession
xml:
xxxMapper.xml:domain的类的映射文件
在mybatis中,映射文件中的namespace是用于绑定Dao接口的,即面向接口编程。
parameterType:在映射文件中通过parameterType指定输入 参数的类型 可省略
resultType:在映射文件中通过resultType指定输出结果的类型
#{}接收输入参数,类型可以是简单类型,pojo、hashmap
keyProperty keyColumn use
Apache Shiro
易使用的Java安全框架,进行认证、授权、加密和会话管理
web.xml配置shiroFilter(放在最上面)
applicationContext-shiro.xml,对shiro进行配置
applicationContext.xml中引入该文件
JQuery EasyUI
实现CRUD DataGrid
使用的插件:
datagrid:向用户展示列表数据。
dialog:创建或编辑一条单一的用户信息。
form:用于提交表单数据。
messager:显示一些操作信息。
FormData
XMLHttpRequest Level 2添加了一个新的接口FormData.利用FormData对象,我们可以通过JavaScript用一些键值对来模拟一系列表单控件,我们还可以使用XMLHttpRequest的send()方法来异步的提交这个"表单".比起普通的ajax,使用FormData的最大优点就是我们可以异步上传一个二进制文件.
进度条
基于multipartResolver多部解析器的上传进度条
①写一个进度条的实体类
②实现ProgressListener
③继承CommonsMultipartResolver
④在springmvc的xml中重新配置自己的解析器
⑤编写Controller
⑥开发jsp、js页面
JQuery
XMLHttpRequest对象的 onload 回调函数是在异步请求加载完成后所执行的函数,当JavaScript监测到请求的数据全部传输完成后就会触发该函数。而 open() 函数设置异步请求的 method、URL 和同步方式等参数,执行 open() 后再执行 send() 函数才开始向服务器发送请求。