文章目录
JSP简述
JSP是一种动态网页技术,Java Server Pages,Java + HTML ,HTML是作为页面内容显示,Java是作为动态逻辑处理。
它实质上是一种模板技术,然后通过Tomcat的Jasper组件,可以将其翻译为.java文件,然后编译运行。
它里面的每一块组成都会被翻译到.java文件的对应位置。
脚本:<% %> -> _jspService()方法内
表达式:<%= %> -> _jspService()方法内 的 out.print()
声明:<%! %> -> .java文件内的成员位置
掌握request和response的使用
1.1 JSP的九大内置对象
out:向页面输出内容
out.print(); // 它可以输出任何数据类型 将对应的数据类型转换为字符串 它用于向页面输出我们Java一些变量信息
out.write(); // 它只能输出字符(字符串)内容 它用于向页面输出HTML内容
request: 它代表的就是客户端的请求
response: 它代表的是服务端的响应
session: 会话技术
application:应用程序上下文
page: 它指代当前页面,当然如果是翻译后的,那么它指代当前对象
pageContext:它是用来获取其他作用域内容的 同样它也是页面的上下文
config: 它可以获取到初始化配置参数(web.xml)
exception:它能够获取到某个页面上出现的异常信息 一般要和<%@page errorPage=“error.jsp” %>结合使用
1.2 request内置对象
主要用于处理客户端请求
1、请求对象:request
request作用域:请求的范围,在一次请求的范围内
public String getParameter(String name)
HTML代码:
<input type= "text" name= "userName" >
JSP代码:
String userName =request.getParameter("userName );
注:有快捷键Ctrl+Alt+向下的箭头就能复制上一行
2、获取同名的多个参数
HTML代码:
<input type="checkbox" name="mailId" value=" 10001"/>
<input type="checkbox" name="mailId" value="10002"/>
<input type="checkbox" name="mailId" value="10003"/>
<input type="checkbox" name="mailId" value="10004" />
<input type="checkbox" name="mailId" value="10005" />
JSP代码:
String[ ] mailId=request.getParameterValues("mailId ");
if(mailId!=null& mailId.length!=0){
//循环mailds访问提交的数据
}else{
//未提交与参数maild相关的数据
}
模拟一个注册:
<form action="doRegister.jsp" method="POST">
<p>
帐号:<input type="text" name="username" value="admin"/>
</p>
<p>
密码:<input type="password" name="password" value="123456"/>
</p>
<p>
爱好:
<input type="checkbox" name="hobby" value="1"/>编程
<input type="checkbox" name="hobby" value="2"/>学习
<input type="checkbox" name="hobby" value="3"/>写作业
</p>
<p>
<input type="submit" value="注册" />
</p>
</form>
<%
// 接收客户端的请求参数
// 根据name属性获取对应value的值
// 获取单个值的参数
String username = request.getParameter("username");
String password = request.getParameter("password");
// 获取多个值的参数
String[] hobbies = request.getParameterValues("hobby");
%>
<!-- out.print() -->
<%="接收到的用户名为:"+username %> <br/>
<%="接收到的密码为:"+password %> <br/>
<%
out.print("接收到的爱好有:");
for(String hobby : hobbies){
out.print(hobby+" ");
}
%>
String getParamepter(String name);
根据name获取value值 如果获取不到返回nullString[] getParamepterValues(String name);
根据name获取多个value值的参数Map<String,String[]> getParamepterMap();
将请求参数全部注入到Map集合String getMethod();
获取请求方式String getRemoteAddr();
获取客户端的IP地址String getContextPath();
获取项目的根路径String getHeader(String name);
获取请求头信息InputStream getInputStream();
获取参数的字节输入流void setAttribute(String name,Object val);
向request作用域存储信息 但是这个信息只能在同一次请求中有效Object getAttribute(String name);
从request作用域提取信息 如果不存在则为nullRequestDispatcher getRequestDispatcher(String path);
获取请求转发对象forward(request,response);
实现请求转发
1.3 get请求和post请求的区别
GET:
- 地址栏会显示传递的参数
- 一般来讲浏览器对GET请求有数据长度限制
- URL具有传播性
- 不安全
POST:
- 地址栏不会显示传递的参数 通过请求体传输
- 一般来讲浏览器没有数据长度限制
- URL不具备传播性
- 相对安全
1.3.1 post提交方式的中文乱码解决办法
在提交的JSP页面填入一句代码
语法:
request.setCharacterEncoding("utf-8");
1.3.2 get提交方式的中文乱码解决办法
方法一:治标
语法:
字符串.getBytes("ISO-8859-1"),"utf-8"
示例:
String userName = request.getParameter("username");
userName=new String(userName.getBytes("ISO-8859-1"),"utf-8");
方法二:治本
配置tomcat\conf\server.xmI文件
<Connector connectionTimeout " 20000" port="8080"
protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
1.4 response内置对象
response对象用于响应客户请求并向客户端输出信息
•获得客户机信息
–getRequestURL 方法返回客户端发出请求时的完整URL。
–getRequestURI 方法返回请求行中的资源名部分。
–getQueryString 方法返回请求行中的参数部分。
–getRemoteAddr 方法返回发出请求的客户机的IP地址
–getRemoteHost 方法返回发出请求的客户机的完整主机名
–getRemotePort 方法返回客户机所使用的网络端口号
–getLocalAddr 方法返回WEB服务器的IP地址。
–getLocalName 方法返回WEB服务器的主机名
–getMethod 得到客户机请求方式
•获得客户机请求头
–getHead(name)方法
–getHeaders(Stringname)方法
–getHeaderNames方法
•获得客户机请求参数(客户端提交的数据)
–getParameter(name)方法
–getParameterValues(Stringname)方法
–getParameterNames方法
–getParameterMap方法 //做框架用,非常实用
1.5 转发和重定向
1. 转发(页面实现跳转了,请求的信息也一起转移)
用户进行一次请求,但是服务器内部自动完成了跳转,服务器的行为无形中延长了request作用域;所以用户看到的地址栏并不是应该的最后的跳转地址,依然是上一个地址。
RequestDispatcher对象 forward()方法
<%
//1、request.getRequestDispatcher("url").forward(request, response)
//转发到register页面
request.getRequestDispatcher("register.jsp").forward(request,response);
//转发传递信息 response.setAttribute(键,Object);
response.setAttribute("msg","注册成功!");// 相当于一个 key-value --> msg,注册成功
//在另一个页面获取信息
request.getAttribute("msg");//获取到的是一个Object
//2、<jsp:forward page="url" />
%>
2. 重定向(页面实现跳转了,但是请求的信息不一起转移)
用户进行一次请求,服务器只是提示用户要跳转但是自己没有进行跳转,所以不会转移信息。
将用户请求重新定位到一个新的URL
response.sendRedirect("url")
如果想让重定向也能传递信息要使用如下方法:
String mess = "成功";
mess = URLEncoder.encode(mess, "UTF-8");
response.sendRedirect(request.getContextPath()+"/index.jsp?mess="+mess);
在转到页面要使用如下方法:
String mess = request.getParameter("mess");
mess = URLDecoder.decode(mess, "UTF-8");
out.println(mess);
其中:?参数=的语法结构就是在传递参数;但是在传递中文时会出现乱码的情况,详细介绍请看前面的“中文乱码的解决”。
1.6 理解转发和重定向的区别[面试题]
请求转发:
- 地址栏不变化 还是原来的请求
- 请求转发它是一次请求
- 请求转发它只能跳转到服务器内部的资源
- 请求转发是服务器在帮助你进行页面跳转
重定向:
- 地址栏会变化 变为新的请求地址
- 重定向是两次请求
- 重定向可以跳转到任意地址/资源
- 重定向是服务器响应给客户端一个标识(302),然后客户端重新进行页面跳转
1.7 session内置对象
使用场景:你在登录某个网站,登录之后,发现在这个网站中任意跳转该网站所属页面,你的登录信息一直展示着。你的购物车里的商品(未登录)。
如何理解session在一次会话中存储的数据均有效。
我们都打过电话,在一次通话中,你请求了n次,同时对方也响应了n次。
同理,我们所谓的一次会话其实就可以类比一次通话,他表示你访问某个网站的并进行不同的请求,都会得到服务器不同的响应,这个过程就是一次会话,只要你没有停止对该网站的访问,那么都是在一次会话当中。
通话开始:你给服务器发送一次请求。
通话结束:(默认)当你完全关闭某个浏览器,或者更换了浏览器之后,对应的session会销毁,会话结束。
1.7.1 session对象常用方法
-
void setAttribute(String name,Object value);
向session作用域存储内容 这个内容在同一次会话中都是有效的 -
Object getAttribute(String name);
从session作用域中取出内容 -
void removeAttribute(String name);
从session作用域移除内容 -
String getId();
获取当前session的编号 -
void invalidate();
作废session -
void setMaxInactiveInterval(int seconds);
设置session非活动有效期(默认为30分钟) -
int getMaxInactiveInterval();
获取session非活动有效期
1.7.2 session中的setAttribute()作用域是一次会话
会话:一个会话就是浏览器和服务器之间的一次通话;会话可以在多次请求中保存和使用数据;一个会话就是在一段时间内,一个客户端与Web服务器的一连串相关的交互过程;会话可以在多次请求中保存和使用数据:
public void setAttribute(String name, Object value);
用法:session.setAttribute("userName","张三丰");
public Object getAttribute(String name);
用法:String username=(String) session.getAttribute("userName");
1.7.3 session与窗口的关系
- 每个session对象都与一个浏览器窗口对应 ,重新开启一个浏览器窗口,可以重新创建一个session对象(不同版本浏览器可能有所差别)
- 通过超链接打开的新窗口,新窗口的session与其父窗口的session相同
session是一种机制,是服务器端使用的用来记录同一个客户端状态的一个机制—sessionId来判断哪个客户端:session.getId(); public String getId();
【得到当前客户端的编号,每一个session有一个唯一的sessionId】
同一个浏览器不管打开多少次都会显示同一个客户ID;不同的浏览器的到的客户ID不同
1.7.4 会话的清除和过期
Session的数据是在服务器端的,服务器保存的会话数据量会越来越大,从而导致性能问题;所以若没有清理机制,会导致性能问题或服务器崩溃:
- 程序主动清除session数据
手动设置失效:session.invalidate()
【程序里最常用的方法】
移除会话的一个属性:
public void setAttribute(String name);
用法:session.removeAttribute("userName");
- 服务器主动清除长时间没有再次发出请求的session
设置会话过期时间超时失效:
方法一:通过setMaxInactiveInterval( )
方法,单位是秒
public void setMaxInactiveInterval (int Interval);
示例:
<%
session.setAttribute("login","admin");
session.setMaxInactiveInterval(600);
response.sendRedirect("admin.jsp");
%>
方法二:通过设置项目的web.xml
或Tomcat
目录下的/conf/web.xml
文件,单位是分钟
<session-config>
<session-timeout>10</session-timeout>
</session-config>
1.8 掌握cookie和session的区别[面试题]
一些网站里例如百度在搜索时有历史记录提示
一些网站里登录时可以勾选7天免登录或者记住我等功能
cookie它和客户端有关。
实质上session使用到的就是会话级的cookie。当浏览器第一次访问服务器时,服务器会生成一个session
并且将session的id写入到浏览器的会话级cookie,当浏览器访问服务器时,会携带此cookie,服务器会对cookie中的session
id进行验证,如果有则表示是同一次会话,否则说明会话不存在或者已经过期了,那么就会重复之前的步骤。
Cookie和Session区别:
- cookie只能存储String类型的值,而session可以存储任意类型的内容
- cookie可以设置会话级也可以设置持久级,而session只能是会话级
- cookie是客户端存储的内容,而session是服务器存储的内容
- cookie不够安全,session相对安全,一些重要信息推荐放在session中
1.9 cookie
1.9.1 cookie对象的常用方法
-
void setMaxAge(int expiry)
设置cookie的有效期,以秒为单位 -
void setValue(String value)
在cookie创建后,对cookie进行赋值 -
String getName()
获取cookie的名称 -
String getValue()
获取cookie的值 -
int getMaxAge()
获取cookie的有效时间,以秒为单位 -
setPath("/")
设置返回值,加上setPath("/");这句话说明cookie对于整个工程是可见的,如果不加这句话cookie只对当前这个路径和它的子目录可见;
1.9.2 cookie以文件方式保存数据
添加Cookie
<%
//添加到cookie
Cookie cookie = new Cookie("name", userName);
//设置有效期1天
cookie.setMaxAge(60*60*24);
//添加到cookie
response.addCookie(cookie);
%>
获取cookie
<%
//获取cookie
Cookie [] cookies = request.getCookies();
String name = "";
for (int i = 0; i < cookies.length; i++) {
if (cookies[i].getName().equals("name")) {
name = cookies[i].getValue();
}
}
%>
2.0 cookie与session的对比
-
session:
- 在服务器端保存用户信息
- session中保存的是Object类型
- 随会话的结束而将其存储的数据销毁
- 保存重要的信息
-
Cookie:
- 在客户端保存用户信息
- cookie保存的是 String类型
- cookie可以长期保存在客户端
- 保存不重要的用户信息
2.1 application内置对象
2.1.0 application对象的常用方法
-
void setAttribute(String key,Object value)
以key/value的形式保存对象值 -
Object getAttribute(String key)
通过key获取对象值 -
String getRealPath(String path)
返回相对路径的真实路径
2.1.1 application使用
示例:统计网站访问次数的实现:一个用户进行多次刷新页面 多个用户访问页面
分析:
- 每个用户都需要使用访问次数
- application可在整个项目中共享使用数据
- 使用application实现计数器
- 每次访问该页面,计数器加1
解决方法:
public void setAttribute(String name, Object object)
application.setAttribute(String name, Object object);
public Object getAttribute(String name)
application.getAttribute(String name);
统计页:
<%
Integer count = (Integer) application.getAttribute("count");
if (count != null) {
count = 1 + count;
} else {
count = 1;
}
application.setAttribute("count", count);
%>
显示页:
<%
Integer i = (Integer) application.getAttribute("count");
out.println("您好,您是第 " + i + " 位访问本网站的用户");
%>
但是服务器停了之后重新启动就会重新计数
2.1.2 三个对象对比
request
、session
、application
相同点:都可以存储属性
不同点:
- request中存储的数据仅在一个请求中可用
- session中存储的数据在一个会话的有效期内可用
- application中存储的数据在整个Web项目中可用
2.2 JSP常用内置对象的作用域
-
page作用域:
对应的作用域访问对象为pageContext 对象
page的作用域指本JSP页面的范围:
pageContext.setAttribute(键,值)
pageContext.getAttribute(键)
-
request作用域:
对应的作用域访问对象为request 对象
request的作用域内的对象则是与客户端的请求绑定在一起
-
session作用域:
对应的作用域访问对象为session 对象
session的作用域是一次会话
-
application作用域:
对应的作用域访问对象为application 对象
application的作用域是面对整个Web应用程
2.3 JavaBean
就是一个Java类
封装业务逻辑
封装数据
2.3.1 JavaBean的优势
- 解决代码重复编写,减少代码冗余
- 功能区分明确
- 提高了代码的维护性
2.3.2 JavaBean的功能上可以分为
- 封装数据
- 封装业务
2.3.3 封装数据的JavaBean
技巧:
使用工具自动生成getter/setter方法:
Alt+Shift+S —> Generate Getters and Setters
除了要建立的util包之外一般还有service包:
名字都是:***Service:接口 <— 业务逻辑
Dao(接口)—> DaoImpl(接口实现类):数据库的数据操作
一般一个Dao对应一张数据表(*******)