Maven安装:
Maven下载:Maven – Download Apache Maven
右击解压缩,注意解压缩过程就是安装过程,注意自己解压后文件的目录
记住自己解压后的文件目录,我是专门有个文件夹存放安装文件的。这个目录以后要经常用到的,可以集中放在某一路径下。
1、打开环境变量配置界面
2、配置环境
MAVEN_HOME这个变量里面可以只存放maven相关的路径配置,方便日后管理。
这个时候在系统变量里面便会多了MAVEN_HOME这个变量
3、将MAVEN_HOME配置到系统环境变量path中
双击path变量,新建一参数,输入%MAVEN_HOME%\bin后点击确定即可。
完成以上操作后点击确定保存并关闭配置界面
Maven的使用
maven 可以通过一小段描述信息来管理项目的构造,报告和文档的项目管理工具软件
是一个Jar包下载工具,web项目创建工具,项目打包...
安装 直接使用压缩包解压到指定位置,然后配置环境
配置 配置maven目录 - conf - settings 文件 tools:下载jar包的地方
Idea创建Maven项目
web可能会消失,下图是修改web所在位置的地址
在pom.xml加
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2.1-b03</version>
</dependency>
会话 Cookie和Session
会话技术
会话的概念:
项目中的会话,就是浏览器从第一次给服务器发送请求开始,会话建立,直到任意一方断开为止,一次会话中,可能包含多次请求和多次响应。
功能:
主要在一次会话中的多次请求之间,完成数据共享
会话的方式:
1、客户端的会话技术:Cookie
2、服务器端的会话技术:Session
Cookie
Cookie对象是客户端会话技术,将数据保存到客户端
通过Servlet实现cookie使用:
package com.web;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet("/Servlet1")
public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//使用Cookie
//1、创建Cookie对象
Cookie cookie = new Cookie("name", "jack");
//2、响应Cookie回浏览器
response.addCookie(cookie);
//3、通过请求对象,获取Cookie
Cookie[] cookies = request.getCookies();
for ( Cookie cookie1 : cookies) {
System.out.println(cookie1.getName() + "==" + cookie1.getValue());
}
}
}
cookie的实现原理 :
1,当客户端第一次访问服务器的时候,如果服务 器中响应了cookie,浏览器就会把服务器响应的 cookie保存下来
2,当客户端第二次访问服务器的时候,客户端的 请求回携带刚才保存在浏览器的cookie去访问
启动服务器之后有个默认的cookie值的问题
服务器在启动后,一般默认回创建一个session对象, 只要浏览器访问了服务器,服务器就把session的值通 过cookie返回浏览器
如果tomcat设置了启动服务自动开启浏览器,那么等 于是先访问了一次服务器,所以会先拿到一个 JSESSIONID这个cookie值
所以当我们再访问自己需要的资源的时候,就会显示已 经存在一个cookie值l
Cookie的特点
1,一次可不可以发送多个cookie? 可以创建多个cookie对象,使用response多次调 用addCookie方法就可以了
2,cookie可以在浏览器中,保存多长时间?
默认情况下,浏览器关闭后,cookie就被销毁了
通过方法可以设置cookie的生存时间
void setMaxAge(int expiry) 设置 cookie 的 最大生存时间,以秒为单位 ,0表示删除cookie,负值 表示浏览器关闭就销毁了
用法 :
//设置cookie的生存时间
cookie.setMaxAge(60);
3,cookie中能不能存放中文?
tomcat8之后,cookie值中可以存放中文数据
4,cookie的取值范围有多大 ?(数据的共享范围)
public void setPath(String uri)
cookie 对于指定目录中的所有页面及该目录子目 录中的所有页面都是可见的。
同一个服务器下,不同的服务模块中,共享 cookie,可以通过设置setPath值 setDomain(String pattern)
指定应在其中显示此 cookie 的域
不同的服务器下
可以通过setDomain设置相同显示的一级域名地 址,可以实现多个服务器之间cookie的共享
总结:cookie的特点和作用?
1、cookie存放数据在客户端,不太安全
2、cookie存放一般存在大小限制(4KB),一个域名下,存放cookie在20个左右
3、作用就是存放一些不敏感的数据,可以在 不登陆的情况下,完成服务器对客户端的身份识别
Cookie案例
使用cookie完成上一次的访问时间记忆
1,访问的时候,判断有没有cookie,如果有cookie, 就拿到cookie中的时间戳
2,如果没有cookie,表示第一次登录,把第一次登录 时间,放到cookie中
package com.web.cookiecase;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
@WebServlet("/ServletLoginTime")
public class ServletLoginTime extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置请求响应的格式
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//获取一个输出流对象write
PrintWriter writer = response.getWriter();
//获取cookie
Cookie[] cookies = request.getCookies();
boolean flag = true;
//判断获取的cookie数组
if (cookies != null){
//不是有cookie
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
//如果有事先设定好的cookie名称logintime,表示之前访问过
if ("loginTime".equals(cookie.getName())){
flag =false;
//处理logintime中的值
String time = cookie.getValue();
//将字符串转long类型
long loginTime = Long.parseLong(time);
//获取到的毫秒值,转为日期类型
Date date = new Date(loginTime);
writer.write("欢迎回来,上次访问的时间是:" + date.toLocaleString());
}
}
}
if (flag){
writer.write("欢迎你第一次访问!");
}
//如果不存在指定cookie,就创建一个cookie,并且在这个cookie中存入时间戳
Cookie cookie = new Cookie("loginTime", System.currentTimeMillis() + "");
cookie.setMaxAge(60*60*24);
response.addCookie(cookie);
}
}
Session对象的使用
概念 :
Session对象是服务器端的会话技术,在一次会话的多次请 求间,共享数据
· 获取方式 :
通过 HttpServletRequest 对象创建一个HttpSession
HttpSession getSession() 返回与此请求关联的 当前会话,如果该请求没有会话,则创建一个会话。
HttpSession对象的常用方法:
Object getAttribute(String name) 返回与此会话中的指定名称绑定在一起的对象,如果没有对 象绑定在该名称下,则返回 null。
void setAttribute(String name, Object value) 使用指定名称将对象绑定到此会话。如果具有同样名称的对 象已经绑定到该会话,则替换该对象。
void removeAttribute(String name) 从此会话中移除与指定名称绑定在一起的对象。
String getId() 返回包含分配给此会话的唯一标识符的字符串。标识符是 由 servlet 容器分配的,并且是与实现相关的。
package com.web.servletsession;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet("/ServletSession1")
public class ServletSession1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//通过请求对象,获取Session对象
HttpSession session = request.getSession();
//存值
session.setAttribute("name","jack");
}
}
package com.web.servletsession;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet("/ServletSession2")
public class ServletSession2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//通过请求对象,获取Session对象
HttpSession session = request.getSession();
//获取session值
Object name = session.getAttribute("name");
System.out.println(name);
}
}
Session运行的原理
Session是通过Cookie完成传输的
session工作流程
1,当客户端第一次请求服务器的时候,服务器会创建一个 Session对象,并且给Session对象定义一个id值,id值是一 长串随机的字符串
2,第一次请求对应的响应,响应的时候,服务器会创建 Cookie对象,并在Cookie中存入刚才创建的Session的id ,格式是 : JSESSIONID=573184625BB404A1F8959CC6CE94DDF8 3,第一次响应之后,响应回来的cookie会存放在浏览器 中,下次再去请求服务器的时候,会携带这个cookie中的 JSESSIONID
4,第二次请求的servlet中,通过请求过来的的 JSESSIONID中的具体的id值,找到对应的session对象,这 时候,就可以拿到session中的值了
所以,session具有以下特点 :
服务器会给每个用户(浏览器)创建一个session对象,如 果有两个浏览器同时访问服务器,就会创建2个session
一个session独占一个浏览器的,只要浏览器没有关 闭,session就一直存在
将来session可以用来,保存登录用户信息,保存购物 车的信息...
Session其他信息了解
1,当用户客户端关闭,服务器不关闭,用户再次访 问,两次获取的session是否为同一个 ? 默认情况下,不是同一个
如果想让客户端多次访问获取相同的session,可 以手动设置Cookie,并设置JSESSIONID的值
package com.web.servletsession;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet("/ServletSession1")
public class ServletSession1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//通过请求对象,获取Session对象
HttpSession session = request.getSession();
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(60*60);
response.addCookie(cookie);
//存值
session.setAttribute("name","jack");
}
}
package com.web.servletsession;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet("/ServletSession2")
public class ServletSession2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//通过请求对象,获取Session对象
HttpSession session = request.getSession();
System.out.println(session.getId());
//获取session值
Object name = session.getAttribute("name");
System.out.println(name);
}
}
2,客户端不关闭,服务器重启了,两次获取的session 是否是同一个 ?
不是同一个 ,因为服务器重启后,对象都销毁 了,原来的对象信息就不存在了
现实中这种情况不太合理,tomcat服务器会做 session钝化和session活化的操作,确保session中的 数据不会丢失
session钝化 :服务器正常关闭之前,将session对 象序列化到硬盘上
session活化:服务器重新启动后,将session文件 转为内存中的session对象
3,Session什么时候被销毁?
1,服务器被关闭了,session被销毁
2,session对象调用 invalidate() 方法
3,session默认的失效时间 30 分钟 可以自己设置session有效期
<session-config>
<!-- 设置session有效期,单位分钟-->
<session-timeout>1</session-timeout>
</session-config>
Session的其他特点
session相比于servletContext域对象,存放的数据量 会多一些,servletContext中的数据,多个请求可以共享
session可以用来存储一次会话中的多次请求数据,存 在服务器端
session可以存储任意类型、任意大小的数据
说一下cookie和session的特点区别:
1,cookie存在客户端,session存在服务器
2,cookie数据大小有限制,session大小没有限制
3,cookie数据相对不太安全,session比较安全
JSP了解
基本概念: Java Server Pages java服务端页面
JSP中,既可以编写html标签,也可以编写
java代 码,早起的作用就是简化书写
特点 :
写jsp跟写html基本标签用法相同
jsp中可以提供动态数据,html只能写静态的数据
通过查看tomcat工作路径发现,jsp每次运行起来之 后,就被当做java文件编译了
查看代码发现,jsp继承自httpJspBase , httpJspBase 也是servlet的一个子类,所以,其实jsp就是 servlet
jsp中也提供了一些内置对象
将来可以在jsp页面上,直接使用这些对象
页面上展示的所有数据,都是通过out对象,调用方法,将 内容写出的
el表达式
概念 :Exprssion Language 表达式语言
作用 :简化jsp页面中的代码编写
语法:${表达式}
jsp中默认是支持el表达式的
用法
1,运算符 : 支持 算数运算符 、比较运算符、逻辑运 算符 、空运算符 empty
2,从域对象中获取值
语法 : ${域名称.键名} : 从指定的域中获取指定 的键值
域名称:
1,requestScope :一个请求中
2,sessionScope : 一次会话中
3,applicationScope :整个服务器
4,pageScope : 当前页面
3,获取对象、List集合、Map集合的值
1,对象值的获取
本质上是调用对象的get方法
${域名称.键名.属性名}
2,list集合
${域名称.键名[索引]}
3,map集合
${域名称.键名.map中key名称}
${域名称.键名["mapkey名称"]}
4,空运算符
${empty 集合名} 用来判断字符串、集合、数 组 是否为空或者长度为0
package com.web;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class User {
private String name;
private String age;
private String birthday;
public User() {
}
public User(String name, String age) {
this.name = name;
this.age = age;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public long getBrithAge(){
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse(this.birthday);
long time = System.currentTimeMillis() - date.getTime();
return (time / 1000 / 60 / 60 / 24 /365);
} catch (ParseException e) {
e.printStackTrace();
}
return 0;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
}
<%@ page import="com.web.User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %><%--
Created by IntelliJ IDEA.
User: Daisy
Date: 2023/10/16
Time: 9:48
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
用户名:<input type="text" name="username"><br><br>
密 码:<input type="password" name="password">
<div>
</div>
<h1>EL表达式</h1>
<h1>算术运算符</h1>
${1+2}<br>
${5/3}<br>
${3>2&&5>4}<br>
<%--java代码要写在这对标签中--%>
<%
//pageContext.setAttribute("name","alice");
request.setAttribute("name","jack");
session.setAttribute("name","luck");
application.setAttribute("name","lisi");
%>
<h1>获取值</h1>
${pageScope.get("name")}<br>
${requestScope.get("name")}<br>
${applicationScope.get("name")}<br>
${sessionScope.get("name")}<br>
<%--el表达式用来取值的话,可以简写--%>
${name}
<%--创建对象,并把对象放入到域对象中--%>
<%
User user = new User();
user.setAge("jack");
user.setAge("22");
user.setBirthday("1990-10-10");
//在request域中存放对象
request.setAttribute("user",user);
%>
<h1>获取对象,集合中的值</h1>
<%--通过el表达式去获取域中的值--%>
${requestScope.get("user").age}<br>
${user.name}<br>
${user.birthday}<br>
${user.brithAge}<br>
<%
// 创建集合
ArrayList<Object> list = new ArrayList<>();
list.add("hello");
list.add("java");
list.add("world");
//把list放入域中
request.setAttribute("stringList",list);
%>
<h1>获取集合list中的值</h1>
${requestScope.get("stringList")[1]} <br>
${stringList[0]} <br>
${stringList[2]} <br>
<%-- map集合获取示例--%>
<%
HashMap<String, String> map = new HashMap<>();
map.put("one","hello");
map.put("two","world");
map.put("three","java");
request.setAttribute("map",map);
%>
<h1>获取map中的数据</h1>
${requestScope.get("map").one} <br>
${map.two} <br>
${map["three"]} <br>
<%-- ${map.twomm} <br>--%>
<%-- ${map.twommmm} <br>--%>
${map.two} <br>
<%-- 空运算符--%>
<h1>空运算符的使用</h1>
<%
String s = "";
request.setAttribute("str",s);
ArrayList<Object> list1 = new ArrayList<>();
request.setAttribute("list1",list1);
%>
${empty str}
${not empty str}
<%--获取动态虚拟路径--%>
${pageContext.request.contextPath}
<a href="${pageContext.request.contextPath}/xxxservlet"></a>
</body>
</html>
JSTL表达式
概念: Java Server pages Tag Library jsp标准标签 库
用于简化和替换jsp页面的一些Java代码
使用步骤 :
1,导入jar包依赖
2,引入标签库
3,使用标签
c:if
<%@ page import="java.util.ArrayList" %><%--
Created by IntelliJ IDEA.
User: Daisy
Date: 2023/10/16
Time: 11:48
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--c:if 表示判断指定的结果,从而显示内容
必填属性:test,需要设置true或false
--%>
<%
ArrayList<Object> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
list.add("6");
list.add("7");
list.add("8");
list.add("9");
list.add("10");
request.setAttribute("list",list);
%>
<%--c:if 判断标签
属性:
test 是此标签必填属性,结果为true或者false,如果是true,就将标签中的内容显示
如果是false,此标签内容不显示
--%>
<c:if test="true">
<h1>你好</h1>
</c:if>
<%--配合el表达式--%>
<%
//ArrayList<Object> list1 = new ArrayList<>();
//request.setAttribute("list",list);
%>
<%--如果list内容为空,如果为空,就不显示,不为空,才显示--%>
<c:if test="${not empty list}">
${list[0]}<br>
${list[1]}<br>
${list[2]}
</c:if>
</body>
</html>
c:choose
<%--c:forEach 完成循环获取--%>
<c:forEach begin="1" end="10" var="i" step="1" varStatus="s">
${1} ${s.index} ${s.count} <br>
</c:forEach>
<br>
c:for
<%--c:forEach 完成循环获取,获取集合
属性:
items :容器dx
var : 容器的临时对象
varstatus : 循环状态对象
index : 容器的索引,从0开始
count : 循环的次数
--%>
<c:forEach items="${list}" var="str" varStatus="s">
${s.index} ${s.count} ${str}
</c:forEach>
练习 : 在request域中,有一个存有User对象的List集合 通过el+jstl 将集合中的数据,展示到jsp页面,并 放入到表格中
package com.web.java;
public class User1 {
private int id;
private String name;
private int age;
private String sex;
public User1() {
}
public User1(int id, String name, int age, String sex) {
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "User1{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
}
<%@ page import="com.web.java.User1" %>
<%@ page import="java.util.ArrayList" %><%--
Created by IntelliJ IDEA.
User: Daisy
Date: 2023/10/16
Time: 14:31
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
<style>
.mytd{
text-align: center;
}
</style>
</head>
<body>
<%--创建对象,把对象放入request域中--%>
<%
ArrayList<Object> list = new ArrayList<>();
User1 user1 = new User1(1001,"jack",21,"男");
User1 user2 = new User1(1002,"alice",22,"女");
User1 user3 = new User1(1003,"tom",23,"男");
list.add(user1);
list.add(user2);
list.add(user3);
request.setAttribute("list",list);
%>
<br>
<br>
<br>
<table border="1px" cellspacing="0" cellpadding="5px"
width="500px" align="center" bgcolor="#fffc8f">
<tr>
<th>编号</th>
<th>姓名</th>
<th>年龄</th>
<th>性别</th>
</tr>
<c:forEach items="${list}" var="str" varStatus="s">
<tr class="mytd">
<th>${str.id}</th>
<td>${str.name}</td>
<td>${str.age}</td>
<td>${str.sex}</td>
</tr>
</c:forEach>
</body>
</html>
MVC开发模式
1,早期,只有servlet,只能通过response对象,将各种数 据写出来
2,后来出现jsp,简化了servlet开发,jsp中既可以写前端 代码,也可以写java代码,开发的时候,过度使用jsp,造成 难以维护的情况
3,再后来,javaweb开发,借鉴了mvc开发模式,使得开 发的流程更加合理
MVC : 将一个javaweb的开发程序,分为3个部分, M、 V、C
M: model 模型,完成具体的业务操作,比如 ,数据库查 询、封装对象...
V: view 视图 jsp ,主要功能是展示数据
C: controller 控制器(servlet)
用来获取用户输入,调用模型结果,处理逻辑,将处理 结果交给视图展示
项目架构分层 :
界面层 : 用户看到的界面
业务逻辑层 : 处理业务逻辑的
数据访问层 : 操作数据库存储文
使用MVC模式写一个简单的案例 :
使用:JSP、Jdbc、Servlet、MySQL、Tomcat 完成一个简 单的员工管理系统
开发步骤:
1,创建数据库
2,创建项目,导入依赖
3,编写程序
4,测试
5,部署