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
配置初始化参数
获取
servlet
的参数
String value = getServletConfig().getInitParameter(
“
name
”
);
配置全局参数
获取全局参数
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
”
> jsp:userBean>
”
user
”
property=
”
对象下面的属性名
”
value=
”
值
”
> jsp:setProperty>
”
user
”
roperty=
”
对象下面的属性名
”
> jsp:getProperty>
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=
”
${}
”
> fmt:formartDate>
pattern
=
”
0.00
”
> fmt:formartNumber>
国际化
根据浏览器的语言环境自动根据
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
实现创建和销毁的方法
A pplication
是服务器启动的时候创建,服务器停止的时候销毁
myClass implements ServletRequestListener
对 request
的生命周期监听
myClass implements HttpSessionListener
对 session
的生命周期监听
监听器由容器负责管理和注册
在 web.xml
中配置监听器
自定义的监听器类
对属性进行监听
myClass implements HttpSessionAttributeListener
对属性的添加,修改,移除进行监听
方法内可以获取哪个属性被监听了
getName()
获取被监听的属性名,
getValue()
获取被监听的属性值
Ajax
异步的
javascript
和
xml
A jax
的作用是:在不重新加载整个网页的情况下,实现与服务器的数据交互,并局部更新网页
原始的用法 :
通过 xmlhttp
对象进行请求的发送
X mlhttp.open(
“
请求方式
” ,
” url
地址
” ,true);
X mlhttp.send();
X mlhttp.onreadystatechange = function(){
//readyState
有
5
中状态
0-4
if( readyState==4 && status == 200
) {
X mlhttp.responsetText
获取响应的内容
,
处理响应的结果
}
}
Jquery ajax
J query
本身是一个
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
这个参数