javaweb知识汇总

S ervlet 配置
1,  首先创建 servlet 的类(就是一个普通的 java 类),需要继承 HttpServlet
2,  重写 HttpServlet 提供的默认调用的 doGet HttpServletRequest req,HttpServletResponse re s ; 方法
3,  编写 doGet 方法内部   rep.getWriter()
4,  web.xml 中进行 servlet 注册
loginServlet
包名 . 类名
5, 编写 servlet 的映射信息
servlet 一样的进行匹配
/ 访问的路径名
 
W eb 容器 tomcat 负责管理 servlet 的生命周期
S ervlet 的生命周期
1, 初始化
实例化对象,调用 init() 方法 , 只执行一次
默认是 servlet 第一次被访问的时候
0
表示在服务器启动的时候初始化
 
2, 服务 service
默认则是调用 service 方法 , service 调用辅助方法 doGet(HttpServletRequest req,HttpServletResponse resp)  doPost()
 
3, 销毁
服务器停止的时候,调用 destory() 方法
 
servlet 配置初始化参数
name
value
获取 servlet 的参数
String value = getServletConfig().getInitParameter( name );
 
配置全局参数
name
value
获取全局参数
String value =getServletContext().getInitParameter( name );
 
HttpServletRequest 对象
String  value = request.getParameter( 参数名字 );
”username”/>
 
通过url 地址传参
xxServlet? 参数名 = 参数值 & 参数名 = 参数值
 
中文乱码
一,请求中的乱码
如果请求方式为post  (form 表单的 method 设置为 post 的时候 )
request.setCharacterEncoding( utf-8 );
 
如果请求方式为get
1 request.setCharacterEncoding(“utf-8 );
String str =   new String(str.getbytes( ISO-8859-1 ), utf-8 );
 
2, 修改 servlet.xml 文件,
Connector 标签中末尾处添加 URIEncoding=”utf-8
建议使用第一种方式解决
 
 
二、响应中的乱码
解决服务器返回结果为乱码的问题:
response.setCharacterEncoding( UTF-8 );
 
返回的结果没有乱码,而在浏览器解析的时候乱码了。
如果是html5   ”utf-8 />
如果是html4  
”content-type  content= text/html;chaeset=utf-8 />\\
 
 
D ay3
1,servlet 的请求方式参数的传递
表单提交   
post get
get 请求只能传字符串,并且有大小限制 ,255KB
post 请求可以传二进制数据 , 所以文件上传只能使用 post 方式 , 没有大小限制
 
直接通过url 地址传参   get
地址?参数名= 参数值 & 参数名 = 参数值
 
可以通过隐藏表单域进行参数传递
”hidden  name= ”” value= ””/>
 
 
通过HttpServletRequest 对象进行参数的获取
String value = request.getParameter( 属性名字 );
 
// 复选框取值方式
String[] values = request.getParameterValues( 名字 );
 
 
2, 文件上传操作
借助第三方的 jar 包去完成文件上传
需要注意三点
1, 提交方式必须是 post
2 enctype=” multipart/form-data
3, 使用 file 标签必须要有 name 属性值
 
List items = S ervletupload.parseRequest(request);
 
for(FileItem item : items){
 
// 判断是不是普通的表单数据
I f(item.isFormField()){
I tem.getFieldName()// 获取 name 属性的值
I tem.getString();// 获取字段的 value
}
}
// 文件上传的过程中
需要将虚拟路径转换为物理路径
String filePath = getServletContext().getRealPath( upload );
String filename= “” ;
File file = new File(filePath+ / +filename);
item.write(file);
 
 
// 关于响应
 
 
会话技术
1,  客户端的会话技术
Cookie :服务器发送给客户端的甜点
创建 cookie
Cookie c = new Cookie( 名字 , );
名字和值不能使用中文
并且名字是唯一的,如果出现重复,则会覆盖原来的值
通过 response.addCookie(cookie); cookie 保存在客户端中 . 默认的情况下, cookie 将会在浏览器关闭时清除。
c.setMaxAge(-1);
我们还可以设置 cookie 的有效时间
c.setMaxAge( 整型值 ); 单位为:秒
如果我们想要清除一个 cookie ,只需要将有效时间设置为 0 ,但不要忘了再次通过 response.addCookie();
 
当我再次访问这个网站的时候, cookie 会跟随 request 对象再次发送回服务端
我们就可以在服务端中用过 request.getCookies() 去获取网站中传过来的 cookie 数组
Cookie[] cookies = request.getCookies();
 
if(cookies != null){
for(Cookie c:cookies){
c.getName(); 获取到 cookie 的名字
c.getValue(); 获取值
}
}
C ookie 里面只能存字符串,并且每个网站中最多能存 20 cookie 数据
 
2, 服务端的会话技术
session: 用来区分不同的客户端
sessionId 每个客户端的 sessionId 是唯一的
HttpSession session = request.getSession();
request.getSession(); 如果有 sessionId ,则通过 sessionId 找到所对应的 session 对象,如果没有,则新建
 
session 是基于 cookie 的原理之上的,通过 cookie 在客户端中保存了 jsessionId
 
最大非活动间隔时间
默认是在 tomcat 容器中 web.xml 里面配置的
整型值 ( )
我们还可以对项目单独设置
在项目中的 WEB-INF/web.xml 添加
整型值 ( )
 
还可以在 session 创建之后单独对 session 进行最大非活动间隔时间进行设置
session.setMaxInactiveInterval( 整型值 ( ));
session.setMaxInactiveInterval(-1);session 永不失效
 
// 如何在 session 中共享数据
 
// 添加共享数据
session.setAttribute(String 属性名 ,Object 属性值 );
如果属性名重复了,则是在修改属性值
Object o = session.getAttribue( 属性名 );
 
 
JSP java server pages
 
运行阶段:翻译,编译,类加载,类实例化,初始化,服务,销毁
由元素和模板数据(静态 html
元素又分为:脚本元素 , 指令 , 动作元素
 
 
脚本元素:
普通的 java 脚本元素嵌套在翻译之后的 java 源文件的 service 方法中
<%
J ava 代码
%>
脚本的声明 : 声明方法和成员变量
<%!   
public void test(){
}
%>
 
J ava 脚本的输出
<%= 结果 %>
J ava 的脚本注释
<%-- 脚本注释 --%> 不会在源文件中显示
 
指令
P age 指令 :<%@ page language=” java   import= 导入所需类的路径 , 多个   pageEncoding= UTF-8 %>
 
I nclude 指令 :<%@ include  file=” 文件路径 %>
静态包含 : 是将两个 jsp 合在一起翻译和编译,则其代码都在一个 service 方法内部,所以不允许使用相同的变量
 
T aglib 指令 :<%@ taglib uri=” tld 中的 uri”  prefix= 使用时的别名 %>
 
动作元素 :
请求转发
xx.jsp >
动态包含 :
所包含的页面路径 >
参数名  value= 参数值 >
动态包含是将两个 jsp 文件分开翻译和编译,并且在动态包含的过程中可以传参,允许有相同的变量
 
useBean
user  class= com.lovo.bean.User  scope= page/request/session/application >
 user   property= 对象下面的属性名  value= >
 
user  roperty= 对象下面的属性名 >
 
J sp 的内置对象 ( 隐式对象 )
out,request,response,session,application,page,pageContext,config,exception
 
使用 exception 的时候需要注意,首先要通过 page 指令 的属性 isErrorPage=” true
其余的 8 个内置对象可以直接在 jsp 中使用,因为翻译后自动会创建这些对象
 
 
jsp 中编写 java 代码,效率很低,在 servlet 中编写 html 效率也低,为了解决这一问题,提出了 mvc 的开发模式, mvc 的开发模式是基于表示层的一种开发模式
 
M : model 模型   javabean
J avabean 遵循一定的规则
变量私有化,对外提供访问器,就是提供 set/get 方法
变量名首字母要小写 , 还需要序列化
 
V:view 视图    jsp   只做显示的效果  ,所以我们要避免在 jsp 使用脚本元素
 
 
C:control 控制器     servlet
负责获取请求,处理请求(将数据存储在请求,会话,上下文中) , 然后根据结果选择相应的视图进行重定向或者请求转发
 
如何编写无脚本的 jsp 页面
 
E l 表达式和 JSTL 标准标记库
 
EL 表达式语言 :
语法 :${ 常量值 }
对于这个值可以进行一些运算
算术运算 :+,-,*,/,%  
比较运算符 :> < >= <= == != gt lt ge le eq ne
逻辑运算符 : && || !
 
还可以从作用域中获取值
${ 作用域中存储的名字 }
取值过程中是作用域从小到大的查找 , 如果找到了,则终止继续往下查找
还可以根据 el 表达式中提供的隐式变量去获取值
${requestScope. 名字 }
${param. 参数名 }
 
通过 el 表达式获取的值有个好处:
即使数据为空,不存在,不会报错,最多不显示
 
${ 对象名 . 属性名 }   根据对象调用属性的 get 方法
${ 对象名 [‘ 属性名 ]}
 
JSTL 标准标记库
 
自定义标签
所有标签都是由一个类来完成工作的
1, 创建标签对应的执行类
类需要 extends   TagSupport
重写里面的 doStartTag()
2,  需要在 WEB-INF 下创建 tld 配置文件
U ri 访问时所需的路径
province
报名 . 类名
3, jsp 中通过 taglib 指令引入标签
<%@taglib  uri=   访问时所需的路径  prefix= 别名 ” % >
 
 
J stl 中核心标记库   core
<%@taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c"%>
 
输出
${} >
 
声明变量
i  value= 100 >
${i}
 
条件结构
${ 布尔类型的结果 }” >
没有 else, 只能再写 c:if 取相反的结果判断
 
如果想用多个 if
${ 布尔 }” >
${ 布尔 }” >
 
循环结构 :
 
for(int I  = 0;i<10;i+=2)
i  begin= 0  end= 9  step= 2  >
 
for(User user:users)
user   items= ${ 获取集合源 }” >
${user.userName}
 
fmt 格式化标签
pattern  = yyyy-MM-dd hh:mm:ss  value= ${} >
 
pattern  = 0.00 >
 
国际化
根据浏览器的语言环境自动根据 baseName 去查找语言所对应的资源文件
baseName_ 语言 _ 国家 .properties
messages_en_US.properties
messages_zh_CN.properties
 
资源文件中的名字 />
如果根据语言获取不到,则会在基础文件中查找
 
fn 函数
<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
 
${fn:length(str)}  
fn 函数是提供了对字符串在页面中的一些处理方法
 
监听器
对象的作用域
pageContext 只在当前页面有效
ServletRequest   在一次完整的请求中
HttpSession 是在一次完整的会话过程中
ServletContext   是在整个应用程序中
 
监听器可以对作用域对象进行servlet 事件监听
 
生命周期,属性变化
 
编写一个监听的步骤:
创建监听器类   需要实现作用域对象所对应的接口
: 监听 application 的生命周期
myClass implements ServletContextListener
实现创建和销毁的方法
Application 是服务器启动的时候创建,服务器停止的时候销毁
myClass implements ServletRequestListener
request 的生命周期监听
 
myClass implements HttpSessionListener
session 的生命周期监听
 
监听器由容器负责管理和注册
web.xml 中配置监听器
自定义的监听器类
 
对属性进行监听
myClass implements HttpSessionAttributeListener
对属性的添加,修改,移除进行监听
方法内可以获取哪个属性被监听了
getName() 获取被监听的属性名, getValue() 获取被监听的属性值
 
Ajax   异步的 javascript xml
 
Ajax 的作用是:在不重新加载整个网页的情况下,实现与服务器的数据交互,并局部更新网页
原始的用法:
通过xmlhttp 对象进行请求的发送
Xmlhttp.open( 请求方式 , url 地址 ,true);
Xmlhttp.send();
 
Xmlhttp.onreadystatechange = function(){
//readyState 5 中状态   0-4   
if(readyState==4 && status == 200 ){
Xmlhttp.responsetText   获取响应的内容 , 处理响应的结果
 
}
}
 
Jquery ajax
Jquery 本身是一个 javascript 的函数库,提供了更简便的方法去解决复杂的编码
$( 选择器 ).load(“url ,callback)   将响应的结果加载到选择器中
 
$.get(url,datas,callback); get 方式的发送异步请求
datas  = { 属性名 : 属性值 , 属性名 :……}
$.post(url,datas,callback); post 方式的发送异步请求
$.ajax({
url: 请求的地址,
type: 请求的方式 ,
data: 请求的参数列表 {},
dataType: 响应的结果类型,默认 text ,
success:function(result){
成功时的回调函数, result 参数去接收响应的结果
},
error:function(){
如果请求中有错,则执行
}
});
 
 
 
JSON
是一种存储或者传输的一种格式
{ 属性名 : 属性值 , “属性名” : 属性值 }
属性值: 数字,布尔,字符串,数组,对象, null
 
如何在java 应用程序中返回这个 json 的格式 ?
用第三方的jar
可以通过
JSONObject  o = new JSONObject();
o.  accumulate ( 属性名 , 属性值 );
o.  accumulate ( 属性名 , 属性值 );
 
如果属性名相同,则将值放在了数组中
 
JSONObject o = JSONObject.fromObject(user);
 
将一个List 集合转换为 json
JSONArray result = JSONArray.fromObject(users);
 
在客户端中得到了json 的数据,要进行解析
如果用的是$.get(),$.post(),$.load()
如何解析json
eval(json);
但如果是$.ajax() 默认返回的结果数据是 text 类型 ,仍然要用 eval() 解析
我们还可以设置返回结果数据的类型
$.ajax({dataType: json }); 可以直接访问对象 , 不需要 eval 函数了
 
分页练习
真分页:则是通过sql 语句去做分页查询
假分页: 将所有的数据查询出来,在 javascript 中只显示指定的部分
 
分页中必不可少的参数:currentPage 当前页 ,pageSize 每页显示个数 ,totalPage 总页数 ( 是由 totalCount 总记录数和 pageSize 来决定的 )
if(totalCount % pageSize == 0 ){
totalPage = totalCount/ pageSize;
}else{
totalPage = totalCount/ pageSize+1;
}
 
在数据库中进行根据提供的page 对象查询数据
select * from 表名   limit (currentPage-1)*pageSize,pageSize
 
在页面中恢复数据, 创建表格
创建页码数据:totalPage (可以把 totalPage 在数据库中查出总记录数再进行计算) , 通过 json 把计算的结果传回客户端
我们还要记录当前页,以便做效果显示和上一页,下一页的需求
最终查询的时候需要传currenPage 这个参数
 

你可能感兴趣的:(web)