目录
Java基础
Web前端:
页面结构:html
Servlet、jsp(Java Server Page)=html+java
页面样式:css(Cascading Style Sheet,层叠样式表)
页面交互:js(javascript)、jQuery、AJAX
XML文件
MySQL数据库
JDBC(Java DataBase Connectivty)
JavaWeb项目:
一、Session会话技术:
1.1 引入:
Cookie的局限性:
只能存储非中文字符串,不能存储对象
1个Cookie的容量是4kB。
如果需要保存中文或对象,内容超过4KB,只能使用Session技术。
Session会话数据保存在服务器中(内存)。
1.2 Session的核心:
HttpSession
1、创建或获取Session实例对象:
request.getSession()
2、设置Session对象:
public void setMaxInactiveInterval(int interval); 设置Session的有效时间
public void invalidate() 销毁Session对象
public String getId() 获取Session的编号
3、保存会话数据到Session对象:
public void setAttribute(String name, Object value); 保存数据
public Object getAttribute(String name); 获取数据
public void removeAttribute(String name); 清除数据
public class SessionDemo01 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1.创建或获取Session对象 HttpSession session = request.getSession(); // 2.获取Session的编号 System.out.println("SessionID:" + session.getId()); // 设置有效时间 // session.setMaxInactiveInterval(30 * 60); // 3.保存会话数据 session.setAttribute("account", "zhao"); session.setAttribute("loginTime", new Date()); // 4.获取数据 System.out.println("login time:" + session.getAttribute("loginTime")); } @Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } |
1.3 Session的原理:
1、在第一次访问时创建Session对象,给Session对象分配一个唯一ID,名字叫做JSESSIONID。
2、把JSESSIONID作为Cookie的值发送给浏览器保存。
Cookie cookie = new Cookie(“JSESSIONID”,sessionID);
response.addCookie(cookie)
3、第二次访问,浏览器会带着JSESSIONID的cookie访问服务器。
4、服务器得到JSESSIONID,在服务器的内存中搜索是否存放着对应编号的Session对象。
5、如果找到对应编号的Session对象,直接返回该对象;如果找不到,创建一个新的Session对象,继续走1的流程。
注意:通过JSESSIONID的cookie值在服务器中找到Session对象。Session对象的数据存放在服务器的内存,ID值存放在浏览器的Cookie中。
1.4 Session的细节:
1、getSession()方法:
getSession():
getSession(Boolean create):
getSession()方法等价于getSession(true)——创建或获取Session对象,如果没有匹配的Session编号,会创建一个新的Session对象。
getSession(false)——得到一个Session对象,如果没有匹配的Session,就返回null。
2、void setMaxInactiveInterval(int interval):
设置Session对象的有效时间,默认情况下,30分钟服务器会自动回收Session,单位是秒(s)。
1.5 Session案例-登录与退出:
1、新建login.html
<body> <form action="login.do" method="post"> 账号:<input type="text" name="account" placeholder="请输入账号..." required/><!-- required表示该input不能为空 --> <br> 密码:<input type="password" name="password" placeholder="请输入密码..." required/> <br> <input type="submit" value="登录"/> <input type="reset" value="取消"/> </form> </body> |
2、新建LoginServlet:
public class LoginServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取输入表单内容 String account = request.getParameter("account").trim(); String password = request.getParameter("password").trim(); // 创建或获取Session对象 HttpSession session = request.getSession(); // 假设数据中账号为zhao,密码为1234 if (!"zhao".equals(account)) { // 账号不存在 response.sendRedirect("error.html"); } else { if ("1234".equals(password)) { // 密码正确 session.setAttribute("account", account); // 往Session对象中存放数据 // 当在30分钟之内,使用同一个浏览器再次进入该系统时,可以直接免密码进入 response.sendRedirect("index.html"); } else { // 密码错误 response.sendRedirect("error.html"); } } } } |
3、新建error.html和index.html
error.html |
<body> This is my HTML page. <br>账号不存在或密码错误,请<a href="login.html">重新登录</a> </body> |
index.html |
<body> This is my HTML page. <br>登录成功! <br> <a href="logout.do">退出</a> <!-- 跳转到登录页面,底层需要清除Session --> </body> |
4、新建LogoutServlet:
public class LogoutServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 先清除用户相关的Session数据 // 获取Session HttpSession session = request.getSession(); session.removeAttribute("account"); // 清除 response.sendRedirect("login.html"); // 页面跳转 } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } |
Cookie与Session的关系:
二、jsp入门:
2.1 引入:
Servlet:用Java语言开发的动态资源技术。
Html:静态资源技术。
Jsp:Java Server Page,用Java语言(+html)开发的动态资源技术.
Jsp本质上就是Servlet。
2.2 jsp的特点:
Jsp需要交给Tomcat服务器处理。
Jsp页面既可以是html代码,也可以是Java代码,还可以是Java+html代码。
2.3 jsp的执行过程:
http://localhost:8080/Day30_Demo/index.jsp
1、翻译:Tomcat会到发布路径下找index.jsp文件,把它翻译成index_jsp.java文件,放在Tomcat的work目录之下。
2、编译:Tomcat服务器把index_jsp.java文件编译成index_jsp.class文件。
3、创建对象:Tomcat服务器构造一个index_jsp对象。
4、返回:Tomcat服务器调用index_jsp对象的方法,返回内容呈现在浏览器中。
2.4 为什么说jsp本质上是Servlet?
Jsp翻译成java文件:
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent |
HttpJspBase类:
org.apache.jasper.runtime Class HttpJspBase java.lang.Object extended byjavax.servlet.GenericServlet extended byjavax.servlet.http.HttpServlet extended byorg.apache.jasper.runtime.HttpJspBase |
所以jsp本质上就是Servlet!
Servlet技术可以用在jsp里面。Jsp的技术不一定能用在Servlet里面。
2.5 jsp的生命周期:
Servlet的生命周期:
调用构造方法(第一次访问时执行,只会调用一次)
init()方法(第一次访问时执行,只会调用一次)
service()方法(多次访问多次执行)
destroy()方法(只会执行一次,服务器关闭时执行)
Jsp的生命周期:
翻译:jsp文件->java文件(Servlet)
编译:java文件->class文件(Servlet)
调用构造方法(第一次访问时执行,只会调用一次)
init()方法(第一次访问时执行,只会调用一次)
service()方法(多次访问多次执行)
destroy()方法(只会执行一次,服务器关闭时执行)
三、jsp的语法:
3.1 jsp模板:
Jsp中的html代码。确定了整个页面的框架架构。支持html、css、js、jQuery、UEditor......
3.2 jsp表达式:
语法:<%=变量或表达式 %>
作用:向浏览器输出变量或表达式的计算结果。
注意:
1、本质上会被Tomcat翻译成out.print(“......”),通过该方法向浏览器写出内容。
2、变量或表达式后面不需要带分号。
如:<p>当前的系统时间为:<%=new Date()%></p>
3.3 jsp脚本:
<% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> |
语法:<% java代码 %>
作用:执行java代码
原理:把jsp页面中java代码原封不动的拷贝到对应生成的java文件中,再经过编译成class文件。
3.4 jsp的头文件:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> |
提供页面辅助信息:语言、外部导入库、编码格式等。
3.5 jsp的声明:
<%! Void test(){...} %>
语法:<%! 声明成员变量或成员方法 %>
作用:声明jsp的变量和方法
原理:jsp的变量和方法会翻译成对应的java类的成员变量和成员方法。
<%! private Integer num; public void test(){ System.out.println("Husbandello Wifeorld!"); System.out.println("Husbandello Wifeorld!"); System.out.println("Husbandello Wifeorld!"); System.out.println("Husbandello Wifeorld!"); } %> |
翻译后:
3.6 jsp注释:
注意:这里强调的jsp注释主要针对jsp中java代码,html代码的注释遵循html的语法。
四、jsp三大指令:
4.1 page指令
作用:告诉Tomcat如何翻译jsp文件。
<%@ page
language=”java” 告诉服务器使用什么语言翻译jsp
import=”java.util.*” 告诉服务器java文件使用哪些包,多个包之间用逗号分隔
pageEncoding=”UTF-8” 告诉服务器使用什么编码格式翻译jsp
contentType=”text/html;charset=UTF-8” 服务器发送到浏览器的数据类型和内容编码
errorPage=”error.jsp” 当服务器运行该jsp时发生错误,就跳转到error.jsp
buffer=”8kB” 服务器发送到浏览器的数据最大值。
session=”true”或”false” session域对象是否默认开启(默认是true)
isELIgnored=”false”或”true” 是否忽略EL表达式(默认false)
%>
4.2 include指令
语法:<%@include file=”xxxx.jsp”%>
作用:在当前页面中包含另外一个页面。
原理:把被包含的页面的内容翻译到当前这个页面,合并成一个java文件,再编译成class文件。这个包含方式被称为静态包含(源码包含)。
补充:如果使用了静态包含,被包含的页面不需要出现全局的html标签(比如html、head、body等)
4.3 taglib指令
Struts2框架
五、jsp的内置对象:
5.1 引入:
在jsp开发时,会频繁使用HttpServletRequest、HttpSession、ServletContext等类的对象,如果每使用一次就创建一次很麻烦。Sun公司在设计jsp时,在页面加载完成,会自动创建这些对象,用户可以直接使用。这些对象就叫做内置对象。
举例:
在HttpServlet当中,需要使用Session:
HttpSession session=request.getSession(); (程序员手动写)
在jsp中使用Session
HttpSession session=request.getSession(true); (Tomcat做)
session.getId() (开发者可以直接使用)
5.2 九大内置对象:
内置对象名称 | 类型 |
request | HttpServletRequest |
response | HttpServletResponse |
config | ServletConfig |
application | ServletContext |
session | HttpSession |
exception | Throwable |
page | Object(this) |
out | JspWriter |
pageContext | PageContext |
5.3 out对象:
JspWriter类型,相当于带缓存的PrintWriter。向jsp的缓冲区中写出内容。
当满足下面条件之一时,缓冲区的内容写出:
1、缓冲区满了
2、刷新缓冲区(flush()方法)
3、关闭缓冲区(close()方法)
4、执行完毕jsp页面。
5.4 pageContext对象:
类型是PageContext,jsp页面的上下文。
1、可以获取到其他8个内置对象。
2、本身也是一个内置对象,本身也是一个域对象。
保存数据
pageContext.setAttribute(name,value)
5.5 page对象:
类型是Object(this),就是当前这个jsp页面(本质是Servlet类)的引用。
六、jsp的域对象:
四个:
pageContext page域
request request域
session session域
application context域
作用:保存数据和获取数据(数据共享)
域对象的方法:
setAttribute(name,value) 保存数据
getAttribute(name) 获取数据
removeAttribute(name) 清除数据
域对象的作用范围:
page域:只能在当前jsp页面的范围。
request域:只能作用在同一个请求中使用。(转发)
session域:只能在一次会话中使用。(私有的)
context域:能够在整个web应用中使用(全局的)。
七、jsp应用的小案例:
场景:在Servlet中查询数据库,返回的数据以List类型由服务器传给浏览器,浏览器以表格的形式展示数据。
1、定义入门html:
user.html |
<body> <p>查看全部<a href="user.do">用户列表</a></p> </body>b |
2、定义UserServlet和User类:
UserServlet.java |
public class UserServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 假设从数据库查询到多个用户,组成list集合,返回页面user_list.jsp List<User> users = new ArrayList<User>(); users.add(new User("李俊杰", "lijunjie", "lijunjie", "lijunjie@163.com", "北京")); users.add(new User("李俊杰", "lijunjie", "lijunjie", "lijunjie@163.com", "北京")); users.add(new User("李俊杰", "lijunjie", "lijunjie", "lijunjie@163.com", "北京")); users.add(new User("李俊杰", "lijunjie", "lijunjie", "lijunjie@163.com", "北京")); users.add(new User("李俊杰", "lijunjie", "lijunjie", "lijunjie@163.com", "北京")); users.add(new User("李俊杰", "lijunjie", "lijunjie", "lijunjie@163.com", "北京")); users.add(new User("李俊杰", "lijunjie", "lijunjie", "lijunjie@163.com", "北京")); users.add(new User("李俊杰", "lijunjie", "lijunjie", "lijunjie@163.com", "北京")); request.setAttribute("users", users); // 转发 request.getServletContext().getRequestDispatcher("/user_list.jsp") .forward(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } |
3、新建user_list.jsp:
user_list.jsp |
<%@ page language="java" import="java.util.*,com.bw.entity.User" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>">
<title>全部用户列表</title>
<meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <% List<User> users = (List<User>)request.getAttribute("users"); /* for(User user:users){ System.out.println(user); } */ %> <table border="1" cellspacing="0" cellpadding="8" width="500" align="center"> <tr> <th>姓名</th> <th>账号</th> <th>密码</th> <th>邮箱</th> <th>籍贯</th> </tr> <% for(User user:users){ %> <tr> <td><%=user.getName() %></td> <td><%=user.getAccont() %></td> <td><%=user.getPassword() %></td> <td><%=user.getEmail() %></td> <td><%=user.getAddress() %></td> </tr> <% } %> </table> </body> </html> |