注:来自视频学习笔记,未经允许,不可转载!
欢迎点评.........
欢迎点评.........
欢迎点评.........
一、javaweb基础知识结构图
二、javaweb基础知识详细笔记
1.javaweb工程学习准备
1.1.前端基础知识准备:HTML、HTML5、CSS、JS等
1.2.学习工具安装:JDK-8u271,详细过程参见博客:https://blog.csdn.net/preston555/article/details/109662074
环境变量配置:我的电脑 --> 右键 --> 属性 --> 高级系统设置 --> 环境变量设置
(1)创建JAVA_HOME:安装目录,如 D:\java\jdk-8u271
(2)创建path: %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin
(3)创建classpath:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
1.3.学习工具安装:intellij idea2018,详细过程可百度或在本站搜索
1.4.学习工具安装:Tomcat8:https://blog.csdn.net/preston555/article/details/110188286
1.5.第一个多model的Project创建过程(文字版描述版,以第一次安装使用为例)
create new project --> 进入new Project设置界面 :选择java (1.project sdk选择jdk安装路径;2.additional libraries and frameworks选择web application(4.0);其它默认),next --> project name设置工程名称;project location设置工程保存位置 ;
more settings部分设置model(如果model名字和project name完全一样,就是单model;不一样就是多model模式。),然后finish--> 进入编辑界面--->配置Tomcat(详情参见1.3处链接)
2.http基础知识
2.1.javaweb主流服务器:WebLogic、Tomcat、JBoss
2.2.http相关概念结构图
3.javaweb三大组件之servlet基础知识
3.1.创建servlet的两种操作方法(如创建HelloServlet):选择指定包右键-->new-->(方式1选择java,方式2选择servlet)
(1)(servlet3.0之前)new一个java文件:HelloServlet-->然后继承extends HttpServlet-->Override(复写)其 doGet()和doPost()方法-->配置web.xml文件(在<web-app>这里配置servlet</web-app>)-->部署配置Tomcat-->启动服务器(浏览器显示)
(2)(servlet3.0开始)new一个servlet文件,名称为HelloServlet-->注解里面添加(,URLPattern=”/hello")-->部署配置Tomcat-->启动服务器(浏览器显示)
(3)详细示例,请访问本站博文:https://blog.csdn.net/preston555/article/details/110000469
3.2.servlet的简单应用
(1)通过HttpServletRequest请求对象获取请求信息
package com.study.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.Map;
@WebServlet(name = "RequestServlet",urlPatterns = "/request")
public class RequestServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("接收到get请求");
//请求行
System.out.println("请求方式:"+request.getMethod());
System.out.println("URI:"+request.getRequestURI());
System.out.println("发出请求客户端IP地址:"+request.getRemoteAddr());
System.out.println("服务点请求的IP地址:"+request.getLocalAddr());
System.out.println("访问客户端的端口号"+request.getRemotePort());
System.out.println("web应用路径:"+request.getContextPath());
System.out.println("http协议和版本:"+request.getProtocol());
//获取请求头1:获取一个指定头字段的值,不存在返回-1,存在多个取第一个
String port = request.getHeader("port");
//获取请求头2:获取指定头字段的值,并且按照GMT时间格式转换成一个代表日期/时间的长整数
int port1 = request.getIntHeader("port");
//获取请求头3:获取指定头字段的值,并且将其值转为int型,不存在返回-1,不能转回发生NumberFormatException
long port2 = request.getDateHeader("port");
//获取请求头4:获取所有包含请求头字段的Enumeration
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()){
String element = headerNames.nextElement();
System.out.println(element+":"+request.getHeader(element));
}
//请求参数1:获取请求中指定名称的参数值
String name = request.getParameter("name");
String passWord = request.getParameter("passWord");
System.out.println("用户名:"+name);
System.out.println("密码:"+passWord);
//请求参数2:获取请求中所有参数的名称以及值装入一个map对象中
Map<String, String[]> parameterMap = request.getParameterMap();
//请求参数3:获取请求中所有参数的名称
Enumeration<String> parameterNames = request.getParameterNames();
while(parameterNames.hasMoreElements()){
String s = parameterNames.nextElement();
System.out.println(s);
}
}
}
(2)通过HttpServletResponse响应对象发送响应信息
package com.study.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.Map;
@WebServlet(name = "RequestServlet",urlPatterns = "/response")
public class RequestServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//发送响应行
response.setStatus(201);//发送状态码(200是默认),成功发送用该方法
response.sendError(404,"找不到页面资源!");//发送错误状态码
//发送响应头
response.addHeader("name","preston");//name是头字段,“preston”是值
response.setHeader("name","preston");//与上相同,此外这个可以重复添加相同字段,若相同字段后添加覆盖之前添加
response.addIntHeader("score",100);//作为整数添加
response.setContentLength(100);//设置http响应消息的内容大小,单位是字节
response.setContentType("text/html;charset=utf-8");//设置servlet输出内容的类型
response.setCharacterEncoding("utf-8");//设置响应编码格式
//检验登陆状态方式1
String result="登陆成功!";
//发送响应体1:
// ServletOutputStream outputStream = response.getOutputStream();
// outputStream.write(result.getBytes());
//检验登陆状态方式2
response.setContentType("text/html;charset=utf-8");//没有设置这个编码格式,有可能输出结果是乱码
//发送响应体2:
PrintWriter writer = response.getWriter();
writer.write(result);
}
}
(3)图片验证码创建
package com.study.servlet;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
@WebServlet(name = "VerifyCodeServlet",urlPatterns = "/code")
public class VerifyCodeServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置图片的宽和高
int width=100;
int height=30;
//定义随机字符
String data="abcdefghijklmnopqrstuvwxyz0123456789";
//创建随机对象
Random random = new Random();
//创建图片流
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
//设置图片背景色及形状
Graphics graphics = image.getGraphics();
graphics.setColor(Color.gray);
graphics.fillRect(0,0,width,height);
//设置随机字符数量和颜色、位置及字符
graphics.setColor(Color.black);
String codeString="";
for(int i=0;i<4;i++){
int position=random.nextInt(data.length());
String substring = data.substring(position, position + 1);
codeString +=substring;//拼接单个验证码字符成验证码字符串
graphics.drawString(substring,width/5*(i+1),15);
}
//将验证码字符串设置到请求servletContext作用域中,方便登陆时验证码的验证
this.getServletContext().setAttribute("codeString",codeString);
//输出响应信息到图片中
ImageIO.write(image,"jpg",response.getOutputStream());
}
}
//前端代码
<%--
Created by IntelliJ IDEA.
User: shinelon
Date: 2020/11/23
Time: 10:41
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>验证码</title>
</head>
<body>
<center>
<h2>切换验证码</h2>
<script>
function changeImageCode() {
document.getElementById('btn').isDisable=true;
document.getElementById('identity').src='code?ts='+new Date().getTime();
}
</script>
<img src="code" id="identity" onload="btn.disable=false;" style="cursor: pointer;vertical-align: center" />
<input type="button" value="看不清,更换验证码" onclick="changeImageCode()" id="btn" style="vertical-align: center" />
</center>
</body>
</html>
(4)servlet的生命周期:(servlet是单例)
aa.第一次访问浏览器,先执行init()方法,然后执行service()方法
bb.第二次访问浏览器,如果没有servlet对象存在,先执行init()方法,然后执行service()方法;如果已经存在,则直接执行service()方法
cc.关闭服务器,执行destroy()方法
(5)ServletConfig对象:是它所对应的servlet对象的相关配置信息。
特点是:唯一对应,不能与其它servlet共享
常用方法如下:
/**
* config对象获取servlet对象的相关配置信息
*/
ServletConfig servletConfig = this.getServletConfig();
String encoding = servletConfig.getInitParameter("encoding");//获取初始化的编码格式信息
Enumeration<String> names = servletConfig.getInitParameterNames();//获取初识化参数的所有名称
while (names.hasMoreElements()){
String element = names.nextElement();
System.out.println(element);
}
System.out.println("encoding = "+encoding);
(6)ServletContext对象:是servlet上下文对象,该对象表示当前的web应用环境信息。servletContext对象是域对象,通常称为Context域对象
获取servletContext对象的两种方式:
//方式1:
ServletContext servletContext1 = this.getServletConfig().getServletContext();
//方式2:
ServletContext servletContext = this.getServletContext();
应用如下:
//根据名称获取初识化参数
String encoding1 = this.getServletContext().getInitParameter("encoding");
//获取所有初始化参数名称
Enumeration<String> initParameterNames = this.getServletContext().getInitParameterNames();
//使用servletContext在多个servlet中实现数据共享
this.getServletContext().setAttribute("name","preston");//存放数据
Object name = this.getServletContext().getAttribute("name");//获取数据
this.getServletContext().removeAttribute("name");//删除数据
//使用servletContext读取项目配置文件信息,例如读取db.properties文件
InputStream resourceAsStream = this.getServletContext().getResourceAsStream("/db.properties");
Properties properties = new Properties();
properties.load(resourceAsStream);
String name = properties.getProperty("name");
String passWord = properties.getProperty("passWord");
String url = properties.getProperty("url");
//db.properties
name=preston
passWord=50095
url=baidu.com
(7)servlet之间的跳转:转发(forward)和重定向(redirect)
aa.请求转发:在servlet中如果当前的web资源不想处理请求时,可以通过forward方法将当前的请求传递给其它的web资源处理,这种方式就称为请求转发。
bb.重定向:重定向是根据服务器返回的状态码来实现的。状态码的获取通过服务器httpservletresponse的setstatus()方法设置,然后浏览器根据新的请求网址去访问新网址
请求重定向相关代码:
方法1:
//设置状态码为302,即SC_MOVED_TEMPORAILY
response.setStatus(HttpServletResponse.SC_MOVED_TEMPORAILY);
//在请求头中携带新地址
response.setHeader("Location","http://www.baidu.com"
方法2:
可以写成如下一条语句:
response.sendRedirect(String location);
请求转发相关代码:
request.getRequestDispatcher(String location).forward(request,response)
cc.两者区别
(8)自动刷新的方式:
//自动刷新1:3秒后自动刷新
response.setContentType("text/html;charset=utf-8");
response.setHeader("refresh","3");
response.getWriter().print("3秒后自动刷新");
//自动刷新1:3秒后跳转到指定网页
response.setHeader("refresh","3;url='/hello/index.jsp'");
response.getWriter().print("3秒后自动刷新");
//自动刷新3:3秒后自动跳转到指定网页,也可以点击“跳转链接”跳转到指定页
String message="<meta http-equiv='refresh' content='3;url=/hello/index.jsp'>3秒后会自动跳转到首页,如果没有跳转,请点击<a href='/hello/index.jsp'>跳转连接</a>";
request.setAttribute("message",message);
request.getRequestDispatcher("/index.jsp").forward(request,response);
(9)servlet的线程安全问题:当多个客户端访问同一servlet的同一方法中的共享资源时,web服务器为每一个客户端创建了一个线程,可能引发线程安全问题。解决方式:
aa.同步代码块(即synchronize(this){Thread.sleep(1000);其它代码}(这个方法缺点是:当多个用户同时访问时,有可能用户等待时间过长)
bb.实现SingleThreadModle接口(这个方法已经不推荐使用)
cc.尽量不在servlet实例中使用共享变量(这个相对较好)
(10)实现资源的下载,前提是已经上传资源到服务器中
//前端代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>文件下载页面</title>
</head>
<body>
<center>
<h2>文件下载列表</h2>
<form action="download" method="get">
<p><input type="text" value="大熊猫图片" disabled="false"/>
<input type="text" value="xm.jpg" name="点击下载1" hidden="true"/>
<input type="submit" value="点击下载1" name="down"/>
</p>
<p><input type="text" value="Tomcat8.5.60压缩文件" disabled="false"/>
<input type="text" value="apache-tomcat-8.5.60-windows-x64.zip" name="点击下载2" hidden="true"/>
<input type="submit" value="点击下载2" name="down"/>
</p>
<p><input type="text" value="UML类图" disabled="false"/>
<input type="text" value="UML类图.xlsx" name="点击下载3" hidden="true"/>
<input type="submit" value="点击下载3" name="down"/>
</p>
</form>
</center>
</body>
</html>
//后端执行代码
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取对应点击下载按钮的属性值(比如点击“点击下载1”,得到“点击下载”)
String down = request.getParameter("down");
//获取下载的文件名(通过“点击下载1”得到文件名“xm.jpg”)
String filename = request.getParameter(down);
//通知浏览器不要预览,直接下载(这里得到执行方式)
String type = this.getServletContext().getMimeType(filename);
response.setContentType(type);
//通知浏览器下载的文件名
response.setHeader("Content-Disposition","attachment;filename="+filename);
//获取文件的绝对路径(通过文件名去找文件在服务器上的具体位置,然后开始下载)
String realPath = this.getServletContext().getRealPath("download/"+filename);
InputStream in = new FileInputStream(realPath);
ServletOutputStream outputStream = response.getOutputStream();//输出二进制文件
//文件拷贝
int len=0;
byte[] buffer=new byte[1024];
while ((len=in.read(buffer))>0){//当小于等于0表示文件已经复制完
outputStream.write(buffer,0,len);
}
in.close();
}
(11)综合实例详见:https://blog.csdn.net/preston555/article/details/110004445
3.3.Cookie和Session
(1)两者的相同与不同点
(2)两者的简单应用实例
/**
* cookie简单应用实例:记录网站访问时间
*/
package com.study.cookie;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
@WebServlet(name = "TimeServlet",urlPatterns = "/time")
public class TimeServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Date date=new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd-hh:mm:ss");
String format = simpleDateFormat.format(date);
Cookie cookie = new Cookie("time", format);
cookie.setMaxAge(60*20);
response.addCookie(cookie);
Cookie[] cookies=request.getCookies();
response.setContentType("text/html;charset=utf-8");
String timeValue=null;
for (Cookie cookie1 : cookies) {
if(cookie1.getName().equals("time")){
timeValue=cookie1.getValue();
}
}
if(timeValue==null){
response.getWriter().write("欢迎访问我们的网站");
}else{
response.getWriter().write("您上次访问的时间是:"+timeValue);
}
}
}
/**
* session简单应用实例:获取页面的商品信息
*/
//前端代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>商品列表</title>
</head>
<body>
<h1>商品列表</h1>
<a href="/session/addCart?name=杯子">杯子</a><br>
<a href="/session/addCart?name=书包">书包</a><br>
<a href="/session/addCart?name=电脑">电脑</a><br>
</body>
</html>
package com.study.session;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* 添加商品到session域中
*/
@WebServlet(name = "AddCartServlet",urlPatterns = "/addCart")
public class AddCartServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取到商品信息
String name = request.getParameter("name");
//需要保存商品信息到session中
HttpSession session = request.getSession();
//先获取session中list的集合信息
List list = (List) session.getAttribute("list");
//第一次访问时list不存在,需要创建一个list
if(list==null){
list=new ArrayList();
}
list.add(name);
//将list集合信息设置到session域中
session.setAttribute("list",list);
//设置session的持久化时间
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(60*20);
//表示只在session项目下挈带cookie保存的session的ID信息
cookie.setPath("/session");
response.addCookie(cookie);
}
}
package com.study.session;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;
/**
* 从session域中获得商品信息并读取显示
*/
@WebServlet(name = "GetCartServlet",urlPatterns = "/getCart")
public class GetCartServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
//获取session的集合信息
List<String> list = (List<String>) session.getAttribute("list");
response.setContentType("text/html;charset=utf-8");
//遍历读取集合的信息
for (String s : list) {
response.getWriter().write(s+"<br/>");
}
}
}
4.jsp基础知识
4.1 jsp的运行原理(如hello.jsp):
第一次访问hello.jsp--->helloServlet.jsp--->helloServlet_jsp.java--->编译运行。(因此,本质上就是一个servlet,它经过转化后也有servlet的三个方法:init()、service()、destroy()。
4.2 jsp脚本和注释
4.2.1 jsp脚本
(1)<% java代码 %> -------------------内部的java代码翻译到service方法的内部(用于编写具体业务逻辑,也可以定义局部变量或调用方法,但不能定义方法)
(2)<%= java变量或表达式 %> -----会被翻译成service方法内部out.print()(将已经声明的变量或者表达式输出到浏览器页面上)
(3)<%! java代码 %> -----------------会被翻译成servlet的成员内容(用于声明全局变量或方法,可能有线程安全问题,如变量等,一般不使用)
4.2.2 jsp注释
(1)<!--注释内容 --> -------------------可见范围:jsp源码、翻译后的servlet、页面显示HTML源码
(2)//注释内容 ----------------------------可见范围:jsp源码、翻译后的servlet
(3)<%-- 注释内容 --%> --------------可见范围:jsp源码
4.3 jsp的三大指令
4.3.1 page指令:页面特征设置。格式:<%@ page 属性1=“值1” 属性2=“值2” ... %>;常用属性如下:
(1)language:脚本嵌入语言种类,如 language="java"
(2)contentType:设置输出形式,如 contentType=‘text/html;charset=utf-8"
(3)session:是否jsp在编译时自动创建session,如 session=false 表示不可以;session=true 表示可以;默认是true
(4)import:导入java包,如 import="com.study.entity.User"
(5)errorPage:当前页面出错跳转到哪个页面,如 isErrorPage="true"(表示这个页面是错误页面,反之为普通页面)
4.3.2 include指令:页面包含(静态包含)指令,即包含另一个jsp页面。格式:<%@ include file="被包含界面的地址" %>
4.3.3 taglib指令:在页面中引入标签库(如jstl标签库、struts2标签库)。格式:<%@ taglib prefix="前缀" uri="标签库地址" %>
<%--
Created by IntelliJ IDEA.
User: shinelon
Date: 2020/12/1
Time: 18:30
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>JSP脚本及注释和指令的简单演示页面</title>
</head>
<body>
<%
//声明变量name并初始化(这是java注释)
String name="preston";
request.setAttribute("name",name);
response.setContentType("text/html;charset=utf-8");
%>
<%--输出内容(这是jsp注释)--%>
<%= "name = "+name %>
<!--定义一个成员变量(这是HTML注释)-->
<%! int num=10;%>
</body>
</html>
结果:name = preston
4.4 jsp的九大隐式对象:当jsp被翻译成servlet的时候,service方法内部有九个对象定义并初始化
4.4.1 九大隐式对象内容
4.4.2 九大隐式应用实例(简单)
<%--
Created by IntelliJ IDEA.
User: shinelon
Date: 2020/12/1
Time: 20:37
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>九大隐式对象举例</title>
</head>
<body>
<%--在<% %>里面使用,可直接获取对象使用--%>
<%--out隐式对象应用实例:输出内容--%>
<%
out.write("这是out的隐式对象输出内容");
%>
<%--request和response隐式对象应用实例--%>
<%
request.setAttribute("name","preston");
response.setHeader("title","learning jsp");
%>
<%--session和config隐式对象应用实例--%>
<%
session.setAttribute("password","123456");
String encoding = config.getInitParameter("encoding");
%>
<%--application和pageContext隐式对象应用实例--%>
<%
application.setAttribute("content","welcome to jsp");
//页面显示内容转到first.jsp
//pageContext.forward("/first.jsp");
%>
<%--jsp使用exception对象的前提:必须设置<%@ page isErrorPage="true" %>--%>
<%--显示上面设置的内容--%>
<%=request.getAttribute("name")%>
<%=response.getHeader("title")%>
<%=session.getAttribute("password")%>
<%=encoding%>
<%=application.getAttribute("content")%>
</body>
</html>
4.4.3 常用方法图
(参考博客:https://blog.csdn.net/erlian1992/article/details/51863640 参考的博客中援引的原文地址:http://blog.csdn.net/csuliky/article/details/2439424)
4.5 jsp的四大作用域
4.5.1 四大作用域内容
4.6 jsp的常用标签:jsp标签用来控制jsp的行为,执行一些常用的jsp页面动作,如:
(1) <jsp:forward page="要转发的资源" />
(2) <jsp:include page="包含的资源文件" />(动态包含页面)
4.7 EL表达式:全称Expression Language,提供了在jsp中简化表达式的方法,让jsp代码更加简化,可以嵌入在jsp页面内部,减少jsp脚本的编写
4.7.1 EL的使用示例
//在bean包下创建一个User类
<%@ page import="com.study.bean.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %><%--
Created by IntelliJ IDEA.
User: shinelon
Date: 2020/12/1
Time: 22:25
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>EL表达式</title>
</head>
<body>
<%
request.setAttribute("name","小明");
request.setAttribute("age",20);
User user=new User();
user.setName("preston");
user.setAge(10);
session.setAttribute("user",user);//隐式对象可以直接使用
User user1=new User();
user1.setName("preston1");
user1.setAge(12);
User user2=new User();
user2.setName("preston2");
user2.setAge(15);
List<User> list=new ArrayList<>();
list.add(user1);
list.add(user2);
application.setAttribute("list",list);//设置到context作用域中
%>
<%=request.getAttribute("name")%>
<%
User user3= (User) session.getAttribute("user");//因为其返回的结果是Object,所以需要强转
String name = user3.getName();
out.write(name);
%>
<%
List<User> list1 = (List<User>) application.getAttribute("list");
User user4 = list1.get(0);
out.write(user4.getName());
%>
<%--EL表达式简单如下:--%>
${requestScope.name}
${sessionScope.user.name}
${applicationScope.list[0].name}
<%--EL表达式更简单如下:--%>
${name}
${user.name}
${list[0].name}
</body>
</html>
4.7.2 EL的内置对象
4.7.3 EL的执行表达式,如:${1+1} ${2 eq 3}(判断相等) ${3 > 2 ? true : false}(可以使用三元运算符) ${empty user}(判断对象是否为空}
4.7.4 jstl标签的学习(jsp standard tag library),jstl有五大标签库,核心学习(常用)就是一个(红色部分):
4.7.5 jstl标签之core标签库的简单学习示例汇总(附jsp学习网:https://www.runoob.com/jsp/jstl-core-choose-tag.html):
4.7.6 jstl标签的简单示例(书籍的简单列表展现):
//前端代码
<%--
Created by IntelliJ IDEA.
User: shinelon
Date: 2020/12/1
Time: 23:55
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>书籍的简单列表</title>
</head>
<body>
<c:forEach items="${list}" var="book">
<div>
<img src="${book.image}" width="170" height="170" />
<p>书名:${book.name}</p>
<p>作者:${book.author}</p>
<p>价格:${book.price}</p>
</div>
</c:forEach>
</body>
</html>
//Book实体类
package com.study.bean;
public class Book {
private String name;
private String author;
private String image;
private int price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
}
//servlet
package com.study.servlet;
import com.study.bean.Book;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@WebServlet(name = "BookServlet",urlPatterns = "/book")
public class BookServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Book book1=new Book();
book1.setImage("https://image.baidu.com/search/detail?ct=503316480&z=0&ipn=d&word=%E5%9B%BE%E4%B9%A6&step_word=&hs=0&pn=1&spn=0&di=43670&pi=0&rn=1&tn=baiduimagedetail&is=0%2C0&istype=0&ie=utf-8&oe=utf-8&in=&cl=2&lm=-1&st=undefined&cs=3276848340%2C2569914737&os=438924600%2C2804659761&simid=4065457509%2C546476633&adpicid=0&lpn=0&ln=1053&fr=&fmq=1606839039943_R&fm=&ic=undefined&s=undefined&hd=undefined&latest=undefined©right=undefined&se=&sme=&tab=0&width=undefined&height=undefined&face=undefined&ist=&jit=&cg=&bdtype=0&oriquery=&objurl=http%3A%2F%2Fn.sinaimg.cn%2Ftranslate%2Fw600h407%2F20180104%2FZIPq-fyqincu1601826.jpg&fromurl=ippr_z2C%24qAzdH3FAzdH3Fgjof_z%26e3Bftgw_z%26e3Bv54_z%26e3BvgAzdH3F5AzdH3Fda8b-a8-a9AzdH3F15v-tuyqto7omn888l9_z%26e3Bfip4s&gsm=2&rpstart=0&rpnum=0&islist=&querylist=&force=undefined");
book1.setName("book1");
book1.setAuthor("preston1");
book1.setPrice(100);
Book book2=new Book();
book2.setImage("https://image.baidu.com/search/detail?ct=503316480&z=0&ipn=d&word=%E5%9B%BE%E4%B9%A6&step_word=&hs=0&pn=1&spn=0&di=43670&pi=0&rn=1&tn=baiduimagedetail&is=0%2C0&istype=0&ie=utf-8&oe=utf-8&in=&cl=2&lm=-1&st=undefined&cs=3276848340%2C2569914737&os=438924600%2C2804659761&simid=4065457509%2C546476633&adpicid=0&lpn=0&ln=1053&fr=&fmq=1606839039943_R&fm=&ic=undefined&s=undefined&hd=undefined&latest=undefined©right=undefined&se=&sme=&tab=0&width=undefined&height=undefined&face=undefined&ist=&jit=&cg=&bdtype=0&oriquery=&objurl=http%3A%2F%2Fn.sinaimg.cn%2Ftranslate%2Fw600h407%2F20180104%2FZIPq-fyqincu1601826.jpg&fromurl=ippr_z2C%24qAzdH3FAzdH3Fgjof_z%26e3Bftgw_z%26e3Bv54_z%26e3BvgAzdH3F5AzdH3Fda8b-a8-a9AzdH3F15v-tuyqto7omn888l9_z%26e3Bfip4s&gsm=2&rpstart=0&rpnum=0&islist=&querylist=&force=undefined");
book2.setName("book2");
book2.setAuthor("preston2");
book2.setPrice(80);
Book book3=new Book();
book3.setImage("https://image.baidu.com/search/detail?ct=503316480&z=0&ipn=d&word=%E5%9B%BE%E4%B9%A6&step_word=&hs=0&pn=1&spn=0&di=43670&pi=0&rn=1&tn=baiduimagedetail&is=0%2C0&istype=0&ie=utf-8&oe=utf-8&in=&cl=2&lm=-1&st=undefined&cs=3276848340%2C2569914737&os=438924600%2C2804659761&simid=4065457509%2C546476633&adpicid=0&lpn=0&ln=1053&fr=&fmq=1606839039943_R&fm=&ic=undefined&s=undefined&hd=undefined&latest=undefined©right=undefined&se=&sme=&tab=0&width=undefined&height=undefined&face=undefined&ist=&jit=&cg=&bdtype=0&oriquery=&objurl=http%3A%2F%2Fn.sinaimg.cn%2Ftranslate%2Fw600h407%2F20180104%2FZIPq-fyqincu1601826.jpg&fromurl=ippr_z2C%24qAzdH3FAzdH3Fgjof_z%26e3Bftgw_z%26e3Bv54_z%26e3BvgAzdH3F5AzdH3Fda8b-a8-a9AzdH3F15v-tuyqto7omn888l9_z%26e3Bfip4s&gsm=2&rpstart=0&rpnum=0&islist=&querylist=&force=undefined");
book3.setName("book3");
book3.setAuthor("preston3");
book3.setPrice(200);
Book book4=new Book();
book4.setImage("https://image.baidu.com/search/detail?ct=503316480&z=0&ipn=d&word=%E5%9B%BE%E4%B9%A6&step_word=&hs=0&pn=1&spn=0&di=43670&pi=0&rn=1&tn=baiduimagedetail&is=0%2C0&istype=0&ie=utf-8&oe=utf-8&in=&cl=2&lm=-1&st=undefined&cs=3276848340%2C2569914737&os=438924600%2C2804659761&simid=4065457509%2C546476633&adpicid=0&lpn=0&ln=1053&fr=&fmq=1606839039943_R&fm=&ic=undefined&s=undefined&hd=undefined&latest=undefined©right=undefined&se=&sme=&tab=0&width=undefined&height=undefined&face=undefined&ist=&jit=&cg=&bdtype=0&oriquery=&objurl=http%3A%2F%2Fn.sinaimg.cn%2Ftranslate%2Fw600h407%2F20180104%2FZIPq-fyqincu1601826.jpg&fromurl=ippr_z2C%24qAzdH3FAzdH3Fgjof_z%26e3Bftgw_z%26e3Bv54_z%26e3BvgAzdH3F5AzdH3Fda8b-a8-a9AzdH3F15v-tuyqto7omn888l9_z%26e3Bfip4s&gsm=2&rpstart=0&rpnum=0&islist=&querylist=&force=undefined");
book4.setName("book4");
book4.setAuthor("preston4");
book4.setPrice(70);
Book book5=new Book();
book5.setImage("https://image.baidu.com/search/detail?ct=503316480&z=undefined&tn=baiduimagedetail&ipn=d&word=%E5%9B%BE%E4%B9%A6&step_word=&ie=utf-8&in=&cl=2&lm=-1&st=undefined&hd=undefined&latest=undefined©right=undefined&cs=1411914927,273448151&os=2753521682,576092591&simid=3194411629,3666731164&pn=4&rn=1&di=86130&ln=1053&fr=&fmq=1606839039943_R&fm=&ic=undefined&s=undefined&se=&sme=&tab=0&width=undefined&height=undefined&face=undefined&is=0,0&istype=0&ist=&jit=&bdtype=0&spn=0&pi=0&gsm=0&objurl=http%3A%2F%2Fimg2.tbcdn.cn%2Ftfscom%2Fi1%2F825133894%2FTB2nnQAkXXXXXauXXXXXXXXXXXX_%2521%2521825133894.jpg&rpstart=0&rpnum=0&adpicid=0&force=undefined");
book5.setName("book5");
book5.setAuthor("preston5");
book5.setPrice(90);
List<Book> list=new ArrayList<>();
list.add(book1);
list.add(book2);
list.add(book3);
list.add(book4);
list.add(book5);
request.setAttribute("list",list);
request.getRequestDispatcher("/books.jsp").forward(request,response);
}
}
5.数据库基础知识:https://blog.csdn.net/preston555/article/details/110588959
6.监听器基础知识
6.1.基础知识表
6.2.简单实例应用(定时促销)
web-info目录下的lib包:c3p0-0.9.5.2.jar;commons-dbutils-1.6.jar;
mysql-connector-java-8.0.14.jar;mchange-commons-java-0.2.11.jar总共4个
src目录下的配置文件:c3p0-config.xml
//product类
package com.study.bean;
import java.math.BigDecimal;
public class Product {
private int p_id;
private String p_name;
private BigDecimal p_price;
private String p_image;
private int c_id;
public Product() {
}
@Override
public String toString() {
return "Product{" +
"p_id=" + p_id +
", p_name='" + p_name + '\'' +
", p_price=" + p_price +
", p_image='" + p_image + '\'' +
", c_id=" + c_id +
'}';
}
public int getP_id() {
return p_id;
}
public void setP_id(int p_id) {
this.p_id = p_id;
}
public String getP_name() {
return p_name;
}
public void setP_name(String p_name) {
this.p_name = p_name;
}
public BigDecimal getP_price() {
return p_price;
}
public void setP_price(BigDecimal p_price) {
this.p_price = p_price;
}
public String getP_image() {
return p_image;
}
public void setP_image(String p_image) {
this.p_image = p_image;
}
public int getC_id() {
return c_id;
}
public void setC_id(int c_id) {
this.c_id = c_id;
}
}
//监听器
package com.study.promotion;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.study.bean.Product;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
@WebListener()
public class PromotionListener implements ServletContextListener{
public PromotionListener() {
}
public void contextInitialized(ServletContextEvent sce) {
//创建一个定时器
Timer timer=new Timer();
//调用方法:20秒执行一次
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
try {
ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
QueryRunner queryRunner = new QueryRunner(comboPooledDataSource);
String sql="select * from product";
List<Product> productList = queryRunner.query(sql, new BeanListHandler<Product>(Product.class));
if(productList !=null && productList.size()>0){
for (Product product : productList) {
if(product.getC_id()==1){
BigDecimal p_price=product.getP_price();
BigDecimal temp=new BigDecimal(150);
p_price=p_price.subtract(temp);
product.setP_price(p_price);
System.out.println(product.getP_name()+"现在大促销辣!大家快来看一看,瞧一瞧耶!现在只需"+product.getP_price()+"元!");
}else{
BigDecimal p_price=product.getP_price();
BigDecimal temp=new BigDecimal(100);
p_price=p_price.subtract(temp);
product.setP_price(p_price);
System.out.println(product.getP_name()+"现在大促销辣!大家快来看一看,瞧一瞧耶!现在只需"+product.getP_price()+"元!");
}
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
},new Date(),1000*20);
}
public void contextDestroyed(ServletContextEvent sce) {
}
}
6.3.结果示例:
7.过滤器基础知识
7.1.基础知识表
7.2.简单实例应用(编码格式设置)
package com.study.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "Servlet3",urlPatterns = "/test3")
public class Servlet3 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("你好,hello world!");
}
}
package com.study.filters;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import java.io.IOException;
/**
* 对urlpattern是test3的servlet请求进行拦截
*/
@WebFilter(filterName = "CharsetFilter",urlPatterns = "/test3",initParams = {@WebInitParam(name="encoding",value = "text/html;charset=utf-8")})
public class CharsetFilter implements Filter {
private String encoding;
//获取初始化参数
public void init(FilterConfig config) throws ServletException {
encoding = config.getInitParameter("encoding");
}
//进行过滤操作
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//设置请求编码格式
if(encoding !=null){
resp.setContentType(encoding);
}
chain.doFilter(req, resp);
}
//关闭服务器时销毁
public void destroy() {
encoding=null;
}
}
7.3.结果示例
三、javaweb工程怎么创建
链接在这里:https://blog.csdn.net/preston555/article/details/110000469
四、javaweb项目实例:生鲜管理系统简易版详细过程
链接在这里:https://mp.csdn.net/editor/html/110188286
五、javaweb项目实例:人力资源管理系统简易版详细过程
链接在这里:https://mp.csdn.net/editor/html/110478593