Http协议
概述
HTTP 协议(Hypertext Transfer Protocol, 超⽂本传输协议),是⼀个客户端请求和响应的标准协
议,这个协议详细规定了浏览器和万维⽹服务器之间互相通信的规则。⽤户输⼊地址和端⼝号之后就可
以从服务器上取得所需要的⽹⻚信息。
浏览器中的书写格式
HTTP协议的特点
- ⽀持客户/服务器模式。
- 简单快速
- 灵活
- ⽆连接
- ⽆状态
Servlet
创建一个基本的Servlet类
1:创建一个类继承HttpServlet
2:重写service方法
3:设置注解
示例
@WebServlet("/myservlet2")
public class MyServlet2 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应编码格式
resp.setContentType("text/html;charset=UTF-8");
/* resp.getWriter().write("hahah ");*/
resp.sendRedirect("http://www.baidu.com");
}
}
Servlet的⼯作流程
- 通过请求头获知浏览器访问的是哪个主机
- 再通过请求⾏获取访问的是哪个⼀个web应⽤
- 再通过请求⾏中的请求路径获知访问的是哪个资源
- 通过获取的资源路径在配置中匹配到真实的路径,
- 服务器会创建servlet对象,(如果是第⼀次访问时,创建servlet实例,并调⽤init⽅法进⾏初始化
操作) - 调⽤service(request, response)⽅法来处理请求和响应的操作
- 调⽤service完毕后返回服务器 由服务器讲response缓冲区的数据取出,以http响应的格式发送给
浏览器
Servlet的⽣命周期
servlet 类加载–>实例化–>服务–>销毁。
HttpServletRequest对象
常用方法
1. 获取请求的方式 (GET|POST等)
2. 获取请求的完整路径 (从http开始,到?结束)
3. 获取请求的部分路径 (从项目路径开始,到?结束)
4. 获取请求的参数字符串 (从?开始,到最后)
5. 获取请求的协议版本
6. 获取项目的访问路径 (站点名)
System.out.println(request.getMethod());
System.out.println(request.getRequestURL());
System.out.println(request.getRequestURI());
System.out.println(request.getQueryString());
System.out.println(request.getProtocol());
System.out.println(request.getContextPath());
获取请求的参数
获取请求的参数
1. 获取指定参数名的参数值
request.getParameter("参数名")
注:
1. 表单提交
参数名表示的是表单元素的name属性值
2. 地址栏输入
参数名表示的是"?键=值&键=值"中的键
2. 获取指定参数名的所有参数值
request.getParameterValue("参数名")
// 获取指定参数
String uname = request.getParameter("userName");
System.out.println("姓名:" + uname);
String upwd = request.getParameter("userPwd");
System.out.println("密码:" + upwd);
请求转发
if (uname.equals("admin") && upwd.equals("admin")) {
/**
* 设置请求域:设置数据存放在作用域中,让客户端能够获取数据
*/
request.setAttribute("userName",uname);
/**
* 请求转发
*/
request.getRequestDispatcher("index.jsp").forward(request,response);
} else {
/**
* 设置请求域:设置数据存放在作用域中,让客户端能够获取数据
*/
request.setAttribute("msg","姓名或密码不正确!");
/**
* 请求转发
*/
request.getRequestDispatcher("login.jsp").forward(request,response);
}
HttpServletResponse对象
响应数据
getWriter() 获取字符流(只能响应回字符)
getOutputStream() 获取字节流(能响应⼀切数据)
// 字符输出流
PrintWriter writer = response.getWriter();
writer.write("Hello");
writer.write("<h2>Hello</h2>");
// 字节输出流
ServletOutputStream out = response.getOutputStream();
out.write("Hello".getBytes());
out.write("<h2>Hello</h2>".getBytes());
响应乱码问题
设置响应编码格式
//设置响应编码格式
resp.setContentType("text/html;charset=UTF-8");
重定向
示例代码
// 重定向
response.sendRedirect("http://www.baidu.com");
重定向与请求转发的区别
重定向
-
一种跳转方式。
-
由服务端指导的客户端跳转。
-
1. 客户端跳转。
-
2. 地址栏会发生改变
-
3. 存在两次请求
-
4. request数据不能共享
请求转发
-
一种跳转方式。
-
1. 服务端跳转。
-
2. 地址栏不会发生改变
-
3. 只有一次请求
-
4. 数据可以共享
请求转发只能跳转到当前站点名下的资源,不可以跨域。重定向可以跳转到任意资源。
Cookie对象
概述
Cookie是浏览器提供的⼀种技术,通过服务器的程序能将⼀些只须保存在客户端,或者在客户端进⾏
处理的数据,放在本地的计算机上,不需要通过⽹络传输,因⽽提⾼⽹⻚处理的效率,并且能够减少服务器的负载,但是由于 Cookie 是服务器端保存在客户端的信息, 所以其安全性也是很差的。例如常⻅的记住密码则可以通过 Cookie 来实现。
Cookie对象的创建和发送
创建以及发送的示例代码
// 得到Cookie对象
Cookie cookie = new Cookie("name","admin");
// 发送cookie(将cookie对象响应给客户端)
response.addCookie(cookie);
Cookie对象的获取
示例代码
// 获取所有的Cookie对象
Cookie[] cookies = request.getCookies();
Cookie设置到期时间
Cookie的失效时间
-
cookie默认是关闭浏览器失效(与服务器是否关闭无关)
-
通过maxAge设置cookie的失效时间
-
1. 正整数 表示cookie存活指定秒数。
-
2. 负整数 表示cookie只在浏览器中存活,浏览器关闭即失效.默 认值是-1
-
3. 零 表示删除cookie
示例
// 得到Cookie对象
Cookie cookie = new Cookie("uname1","zhangsan");
// 设置7天失效
cookie.setMaxAge(7*24*60*60);
// 发送cookie(将cookie对象响应给客户端)
response.addCookie(cookie);
HttpSession对象
1. Session对象的获取
request.getSession();
如果session对象存在,则直接获取;如果session对象不存在,则新建session
2. JSESSIONID标识符
当请求到达服务器时,如果使用了session,服务器会去获取一个JSESSIONID的cookie对象
如果cookie对象不存在,则新建session对象,并设置sessionId,将sessionId回传给客户端中,设置对应的cookie
如果cookie对象存在,服务器会比较客户端传递的sessionID是否与服务端的一致
如果不一致,新建session对象,并设置sessionId,将sessionId回传给客户端中,重新设置对应的cookie
如果一致,则获取到当前session对象
Session底层是依赖cookie的,默认关闭浏览器失效。
3. session作用域
在一次会话有效,可以有多次请求和响应,在会话中数据共享。
setAttribute()
getAttribute()
removeAttribute()
request作用域
一次请求中有效,在请求转发中有效,在重定向失效
session作用域
一次会话中有效,无论请求转发还是重定向都有效,会话销毁则失效
4. session的销毁
1. 关闭服务器
2. 关闭浏览器
session底层依赖cookie,cookie默认只在浏览器中存活,浏览器关闭则失效
3. 默认最大不活动时间
当指定时间内没有任何操作,则session对象失效;在时间未到达之前有操作,则会重新计时
服务器中设定了session的最大不活动时间,Tomcat服务器设置的是30分钟
在Tomcat的解压目录的conf中web.xml配置文件中
<!-- session 默认的最大不活动时间。单位:分钟。 -->
<session-config>
<session-timeout>30</session-timeout>
</session-config>
4. 手动设置失效时间
通过session.setMaxInactiveInterval(int) 来设定 session 的最大不活动时间,单位为秒。
通过getMaxInactiveInterval()方法获取当前最大不活动时间
5. 手动销毁
session.invalidate();
// 获取session对象
HttpSession session = req.getSession();
/**
* 常用方法
*/
System.out.println("SessionId:" + session.getId());
System.out.println("会话创建时间:" + session.getCreationTime());
System.out.println("最后一次访问时间:" + session.getLastAccessedTime());
System.out.println("是否是新的对象:" + session.isNew());
/**
* 设置作用域
*/
// 设置request作用域
req.setAttribute("name","request");
// 设置session作用域
session.setAttribute("name2","session");
/**
* session的销毁
*/
// 获取最大不活动时间
int sec = session.getMaxInactiveInterval();
System.out.println("最大不活动时间:" + sec);
// 设置最大不活动时间
session.setMaxInactiveInterval(20); // 20秒失效
// 手动销毁
session.invalidate();
ServletContext对象
ServletContext对象的获取
1:通过request对象获取
2:通过session对象获取
3:通过servletConfig对象获取
4:直接获取
示例代码以及常用方法的代码
/**
* ServletContext对象的获取
*/
// 通过request对象
ServletContext servletContext = req.getServletContext();
// 通过session对象获取
ServletContext servletContext1 = req.getSession().getServletContext();
// 通过servletConfig对象
ServletContext servletContext2 = getServletConfig().getServletContext();
// 直接获取
ServletContext servletContext3 = getServletContext();
/**
* 常用方法
*/
// 获取项目的真实路径
String realPath = servletContext.getRealPath("/");
System.out.println("获取项目的真实路径:" + realPath);
// 获取服务器的版本信息
String serverInfo = req.getServletContext().getServerInfo();
System.out.println("获取服务器的版本信息:" + serverInfo);
/**
* servletContext作用域
* 在整个应用程序中有效,服务器关闭失效
* setAttribute();
* getAttribute();
* removeAttribute();
*/
JSP
基本的语法
JSP
Java Server Page,Java Web端的动态资源,是动态页面。
JSP的注释
1. 显式注释 (在浏览器中审查元素或查看源代码可以看到的注释)
1. 继承HTML风格
<!-- HTML的注释 -->
2. 隐式注释(在浏览器中审查元素或查看源代码不可以看到的注释)
1. JSP自己的注释
<%-- JSP注释 --% >
2. 继承Java风格
// 单行注释
/* 多行注释 */
Scriptlet脚本
1. Java脚本段
定义局部变量,编写语句。JSP生成的源码在编译后的Servlet类中的service方法体中
<%
%>
2. 声明
声明全局变量、方法、类等。JSP生成的源码在编译后的Servlet类体中
<%!
%>
3. 输出
输出变量或字面量。JSP生成的源码在编译后的Servlet类中的service方法体中
<%= %>
静态包括
静态包括
<%@include file="要包含的文件的路径"%>
特点:
相当于将内容进行复制,只会生成一个jsp源码文件,不能出现同名变量。运行效率高一点点,但耦合度高,不够灵活。
代码示例
<%@include file="head.jsp"%>
<h2>主体内容</h2>
<%@include file="foot.jsp"%>
动态包括
动态包括
<jsp:include page="要包含文件的路径"></jsp:include>
特点:
相当于方法的调用,会生成多个JSP的源码文件,可以定义同名变量。运行效率高,耦合度低。
通过动态包含传递参数
<jsp:include page="head.jsp">
<jsp:param name="参数名" value="参数值"/>
</jsp:include>
注:
1. 如果include动态包含没有参数需要传递,双标签中不要有任何内容,包括空格和回车
2. 设置参数时,name属性不支持任何表达式,value属性支持表达式
示例代码
<jsp:include page="head.jsp"></jsp:include>
<h2>主体内容</h2>
<jsp:include page="foot.jsp"></jsp:include>
<%-- 通过动态包含传递参数 --%>
<jsp:include page="head.jsp">
<jsp:param name="uname" value="admin"/>
<jsp:param name="upwd" value="<%=pwd%>"/>
</jsp:include>
EL表达式
语法:${限域变量名}
一般操作的是域对象的值,无法操作变量。
取值范围:从小到大范围,依次查找;如果找到,则显示;未找到,则往大范围找,如果都未找到,则显示空字符串。
从小到大:page范围 -> request范围 -> session范围 -> application范围
获取指定范围的值: pageScope、requestScope、sessionScope、applicationScope
操作数据
List
大小:${限域变量名.size()}
获取指定值:${限域变量名[下标]}
Map
获取指定值:${限域变量名.key} -- ${限域变量名["key"]}
JavaBean
给属性字段提供get方法
${限域变量名.属性字段名} -- ${限域变量名.get属性字段名()}
empty为空判断 (空返回true;否则返回false)
字符串:判断null和空字符串
List:判断null和size
JavaBean:判断null
等值比较
比较两个值是否相等,返回true或false
== 或 eq
获取域对象:${uname} <br>
获取域对象:${userName} <br>
获取指定范围的域对象:${sessionScope.uname} <br>
获取变量:${str} <br>
<hr><br>
<h2>操作指定类型的数据</h2>
<%
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
request.setAttribute("mylist", list);
%>
获取List的size:${mylist.size()} <br>
获取指定下标的值:${mylist[1]}<br>
<br>
<%
Map map = new HashMap();
map.put("aaa", "111");
map.put("bbb", 2222);
map.put("ccc-a", 333);
request.setAttribute("map", map);
%>
获取Map的值:${map.aaa} -- ${map["bbb"]}<br>
<br>
<%
User user = new User();
user.setUserId(1);
user.setUname("zhangsan");
user.setUpwd("123456");
request.setAttribute("user",user);
%>
获取JavaBean对象:${user} <br>
获取属性字段:${user.uname } -- ${user.getUpwd()} <br>
<br><hr>
<h4>empty</h4>
<%
// 字符串
String str1 = null;
String str2 = "";
String str3 = "test";
request.setAttribute("str1",str1);
request.setAttribute("str2",str2);
request.setAttribute("str3",str3);
%>
${str1 == null || str1 == ""} -- ${str1 != null && str1 != ""} -- ${!empty str1}
<%-- 判断null与空字符串 --%>
${empty str1} -- ${empty str2} -- ${empty str3}
<br><br>
<%
// List
List list1 = null;
List list2 = new ArrayList<>();
List<String> list3 = new ArrayList<>();
list3.add("ccc");
request.setAttribute("list1", list1);
request.setAttribute("list2", list2);
request.setAttribute("list3", list3);
%>
<%-- 判断null和长度为0 --%>
${empty list1} -- ${empty list2} -- ${empty list3}
<br><br>
<%
// JavaBean
User user1 = null;
User user2 = new User();
User user3 = new User();
user3.setUserId(1);
request.setAttribute("user1",user1);
request.setAttribute("user2",user2);
request.setAttribute("user3",user3);
%>
<%-- 判断null --%>
${empty user1} -- ${empty user2} -- ${empty user3}