

愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介:讲解javaweb课程介绍和适合人群
课程介绍
xxxxxxxxxx小滴课堂新版javaweb课程,零基础学习到开发项目实战抛弃传统旧版的javaweb教程,采用新版的Servlet技术,讲解多个核心知识点到达可以独立开发个人网站的水平基础讲解 + 流程图 + 小滴课堂开发者论坛项目实战 + 常见面试题
学Javaweb可以做什么和发展趋势
不要说没有实战!!!! 前面先学怎么用,后续会有项目实战,跟着老师的步骤走,然后再跑

课程学后水平
项目体验
适合人群
学习形式
简介:javaweb课程目录浏览和课程服务
xxxxxxxxxxjavase基础 + HTML/CSS/JS基础 + Mysql基础PS:不会上面的基础也没关系,这些基础都有课程,找客服小姐姐即可
简介:介绍javase、javaweb、javaee联系
javase:
xxxxxxxxxx就是java基础技术栈,做java相关开发的基础,比如javaweb、javaee开发都是必备javase基础回顾Javase目录基础和知识点
javaweb:
xxxxxxxxxx使用java开发网站相关技术,比如Servlet、JDBC、Tomcat、Session/Cookie等技术栈,javaweb里面很多技术,但有部分慢慢被弃用了,比如JSP等技术点企业很少用了前端基础:HTML+CSS+JS数据库基础:Mysql
javaee:
xxxxxxxxxx全称Java Platform,Enterprise Edition,可以构建企业级的面向服务体系结构(service-oriented architecture,SOA)微服务、组件等的技术栈,更多的是框架层面开发构建大型应用主流框架(当然现在还有少数公司用老旧项目):2015年:Struts + Hibernate + Spring SSH2015~2018之间:SpringMVC + Spring + Mybatis SSM2018年到现在:SpringBoot + Spring + Myabtis 新版SSM微服务架构:MicroService : SpringCloud /Alibaba Cloud无服务架构:ServerLess服务网格:Service Mesh
简介:介绍动态网页和静态网页的技术栈
什么是静态网页
什么是动态网页
愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net

什么是URL(统⼀资源定位符,获取服务器资源的一种)
标准格式: 协议://服务器IP:端⼝/路径1/路径N ? key1=value1 & key2=value2
简介:什么是Http超文本传输协议
协议
协议是⼀种约定,规定好⼀种信息的格式,如果发送⽅按照这种请求格式发送信息,那么接 收端就要按照这样的格式解析数据,这就是协议
json协议
xxxxxxxxxx{“name”:"jack","age":23}
xml协议
xxxxxxxxxx<user><name> jack </name><age> 234 </age></user>
http超文本传输协议
什么是http协议
即超⽂本传送协议(Hypertext Transfer Protocol ),是Web联⽹的基础,也是⼿机PC联⽹常⽤的协议之⼀,HTTP协议是建⽴在TCP协议之上的⼀种应⽤
HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,从建⽴连接到关闭连接的过程称为“⼀次连接”
HTTP请求-HTTP响应
响应码:
发展历史
和https的关系
简介:讲解Http协议消息体拆分讲解
Http请求消息结构
请求行
请求头
请求体

Http响应消息结构
响应行
响应头
响应正文

简介:讲解http常见的请求方法和使用
http1.0定义了三种:
http1.1定义了六种
简介:Http常见的响应状态码讲解
浏览器向服务器请求时,服务端响应的消息头里面有状态码,表示请求结果的状态
分类
1XX: 收到请求,需要请求者继续执行操作,比较少用
2XX: 请求成功,常用的 200
3XX: 重定向,浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取;
4XX: 客服端出错,请求包含语法错误或者无法完成请求
5XX: 服务端出错,服务器在处理请求的过程中发生了错误
简介:讲解http常见请求头讲解
http请求分为三部分:请求行,请求头, 请求体
请求头
常见的请求头
简介:讲解Http响应头知识点
响应头
常见的响应头
简介:讲解Http里面的content-type媒体类型讲解
Content-type: 用来指定不同格式的请求响应信息,俗称 MIME媒体类型
常见的取值
text/html :HTML格式
text/plain :纯文本格式
text/xml : XML格式
image/gif :gif图片格式 image/jpeg :jpg图片格式 image/png:png图片格式
application/json:JSON数据格式 application/pdf :pdf格式 application/octet-stream :二进制流数据,一般是文件下载
application/x-www-form-urlencoded:form表单默认的提交数据的格式,会编码成key=value格式
multipart/form-data: 表单中需要上传文件的文件格式类型
愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介:讲解什么是服务器和Tomcat介绍
什么是服务器
远程的一个电脑,里面安装服务器程序监听对应的端口对外提供服务,可以根据用户的请求去获取对应的数据并返回给调用方。
我们说的Web服务器和应用服务器是指服务器电脑上安装的软件
xxxxxxxxxxWeb服务器和应用服务器是有很大的交集,没有很严格的区别,更多的是web服务器处理的是Http协议,应用服务器还可以处理其他协议web服务器:Apache、IIS、Nginx等应用服务器:Tomcat、Jboss等
什么是Tomcat
先说下Apache 组织
xxxxxxxxxxApache软件基金会(也就是Apache Software Foundation,简称为ASF)是专门为运作一个开源软件项目的Apache 的团体提供支持的非盈利性组织,也是我们java开发里面顶级的组织,阿里也向apache组织贡献了多个开源项目
Apache tomcat :
xxxxxxxxxxApache是web服务器,Tomcat是应用(java)服务器,它是一个servlet容器,是Apache的扩展简单来说:是一个开放源代码的轻量级 Web应用服务器,目前javaweb开发里面用的最多一个web服务器之一
简介:Tomcat服务器的下载和安装
安装前提:
xxxxxxxxxx1)电脑需要有java环境,jdk8以上,否则启动不成功2)已经安装Sublime文件编辑软件3)window电脑需要显示文件拓展名上述3点,javase课程环境已经设置过了,如果没设置的自行搜索博文
下载新版Tomcat,选择对应的版本信息,使用9或10,但不建议用最新的,坑不少 版本信息:https://tomcat.apache.org/whichversion.html 软件下载:https://tomcat.apache.org/download-90.cgi
core zip包
启动Tomcat
xxxxxxxxxxmac或者linux: bin/startup.sh (需要增加执行权限:chmod 777 ./*)windows: bin/startup.bat
关闭Tomcat
xxxxxxxxxxmac或者linux: bin/shutdown.shwindows: bin/shutdown.bat 或者关闭CMD窗口
访问路径:http://localhost:8080 或者 127.0.0.1:8080
Windows启动乱码:
xxxxxxxxxx原因:控制台展示编码问题编辑 conf/logging.properties 文件java.util.logging.ConsoleHandler.encoding = UTF-8改为java.util.logging.ConsoleHandler.encoding = GBK
Tomcat是不用配置环境变量的,但是如果启动闪退,参考下面的路径问题 https://www.cnblogs.com/shizunatsu/p/10915107.html
简介:Tomcat目录文件讲解
bin (关注)
xxxxxxxxxx启动和关闭tomcat脚本startup.sh/startup.batshutdown.sh/shutdown.bat
conf(关注)
xxxxxxxxxx存放配置文件server.xml: 配置整个服务器信息 比如修改端口号,添加虚拟主机
lib:
xxxxxxxxxx存放Tomcat运行需要的第三方包,这个目录中的jar所有项目都可以共享如果需要添加Tomcat都依赖的jar文件,可以把它放到这个目录中
log(关注)
xxxxxxxxxx运行的相关日志文件,Tomcat启动和关闭的信息,如果启动Tomcat时有错误catalina.out 运行日志文件,即标准输出和标准出错,也包含tomcat运行自己输出的日志以及应用里向console输出的日志
webapps(关注)
xxxxxxxxxxTomcat的主要Web发布目录,存放web项目,其中每个文件夹都是一个项目其中ROOT是一个特殊的项目,在地址栏中没有给出项目目录时,对应的就是ROOT项目
temp:存放tomcat运行时的临时性数据
愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介:javaweb开发必备软件之IDEA期间版介绍
IDEA 分社区版(Community) 和 旗舰版(Ultimate),我们做JavaWeb开发或者JavaEE开发,推荐大家使用旗舰版,功能更强大
旗舰版是需要付费的,但是有免费使用时间
付费时间到后怎么办?给几点建议,具体可以百度谷歌搜索
有能力建议是支持正版,特殊情况就百度搜索下相关教程或者搞个开源项目申请也行
备注:如果想深入学习IDEA,包括各类插件安装等,可以联系我们小滴课堂的客服小姐姐,有专门的IDEA专题视频,整合了很多中高级技术栈,智能提示、编码规范等等
简介:IDEA配置Tomcat9-win10版本
备注:
1)不同系统或者软件版本直接,可能会有差别,建议看多几个博文参考下流程,百度搜索关键词”IDEA配置Tomcat环境“,查看相关博文
2)javaweb课程配置Tomcat相对麻烦点,后续框架开发的时候就不用配置外部Tomcat了,直接使用内置的Tomcat运行,结合Docker容器
简介:IDEA配置Tomcat9-Mac版本
创建项目

配置tomcat

配置classes目录

配置lib目录


添加Servlet包到项目里面(选择tomcat目录->lib目录->servlet-apiI.jar)


愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介:什么是Servlet,开发第一个动态网站
什么是Servlet
简介:是JavaServlet的简称,用Java编写的运行在Web服务器或应用服务器上的程序,具有独立于平台和协议的特性, 主要功能在于交互式地浏览和生成动态Web内容
作用:接收用户通过浏览器传来的表单数据,或者读取数据库信息返回给浏览器查看,创建动态网页
接口路径:package javax.servlet
1)创建Class,继承HttpServlet
2) 重写doGet方法,返回HTML内容
xxxxxxxxxxpublic class UserServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//实战响应内容resp.setContentType("text/html;charset=utf-8");PrintWriter printWriter = resp.getWriter();printWriter.write("<div> 小滴课堂 xdclass.net 你好,让技术不再难学 </div>");}}
3) 配置web.xml
xxxxxxxxxx<servlet><servlet-name>userServlet</servlet-name><servlet-class>net.xdclass.web.UserServlet</servlet-class></servlet><servlet-mapping><servlet-name>userServlet</servlet-name><url-pattern>/userServlet</url-pattern></servlet-mapping>
4)启动tomcat,进行访问
简介:讲解重写doGet和doPost方法作用
doGet方法:
doPost方法:
http用post方式提交的请求就会进入到此方法
postman工具:
还有其他的doHead、doDelete等,一样的都是根据http提交Method来区分
Servlet访问URL使用路径映射(注意:一定要加 / 开头)
简介: 讲解Servlet的生命周期
Servlet 接口里面有5个方法,其中三个生命周期方法和两个普通方法
服务->执行service方法,service() 方法是 Servlet 的核心。每当一个客户请求一个HttpServlet 对象,该对象的service() 方法就要被调用
销毁-> 执行destroy方法,destroy() 方法仅执行一次,即在服务器停止且卸装 Servlet 时执行该方法
xxxxxxxxxxpublic interface Servlet {void init(ServletConfig var1) throws ServletException;ServletConfig getServletConfig();void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;String getServletInfo();void destroy();}
简介:讲解新版Servlet和旧版Servlet配置的区别
xxxxxxxxxx@WebServlet(name = "userServlet",urlPatterns = {"/user1","/user2","/test"})public class UserServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doGet");//实战响应内容resp.setContentType("text/html;charset=utf-8");PrintWriter printWriter = resp.getWriter();printWriter.write("<div> doGet 小滴课堂 xdclass.net 你好,让技术不再难学 </div>");}}
xxxxxxxxxx//servlet名称,若不指定,则为Servlet的完整类名String name() default "";//路径映射,配置多个,需要/开头String[] value() default {};//路径映射,支持配置多个,需要/开头String[] urlPatterns() default {};//标记容器是否在启动应用时就加载Servlet,默认或数值为负数时表示第一次请求Servlet时再加载;0或正数表示启动应用就加载int loadOnStartup() default -1;//配置初始参数WebInitParam[] initParams() default {};//是否支持异步操作模式boolean asyncSupported() default false;
愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介:讲解Javaweb作用域对象介绍和ServletContext讲解
什么是作用域对象:
ServletContext:
(webapps下的每个目录就是一个应用程序)
四大作用域对象-用于存取数据(举个形象的例子):
生命周期:在WEB服务器启动时创建,服务器关闭时销毁

加载应用默认参数
xxxxxxxxxx<context-param><param-name>url</param-name><param-value>xdclass.net</param-value></context-param><context-param><param-name>username</param-name><param-value>jack</param-value></context-param>
获取api
xxxxxxxxxxServletContext servletContext = req.getServletContext();String url = servletContext.getInitParameter("url");System.out.println(url);
存储全局数据(只要是同个应用,都可以共享这些数据,类似map结构)
xxxxxxxxxxservletContext.setAttribute("appInfo","xdclass.net info");String appInfo = (String)servletContext.getAttribute("appInfo");System.out.println("TestServlet appInfo="+appInfo);
简介:介绍什么是JSP和Servlet的关系
什么是JSP: 全称Java Server Pages,是一种动态网页开发技术;
xxxxxxxxxxrequest HttpServletRequest类的实例response HttpServletResponse类的实例out PrintWriter类的实例,用于把结果输出至网页上session HttpSession类的实例application ServletContext类的实例,与应用上下文有关config ServletConfig类的实例pageContext PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问page Java类中的this关键字Exception Exception类的对象,代表发生错误的JSP页面中对应的异常对象
<% 代码片段 %>
xxxxxxxxxx<%out.println("IP address is " + request.getRemoteAddr());%>
<%= 表达式 %>
xxxxxxxxxx<%=request.getRequestURL()%>
xxxxxxxxxx<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
所以基本很少企业使用JSP了,但是这个是学javaweb里面基础知识,大家可以简单学,不用花特别多时间(学校或者其他老旧的书本会花很多时间讲这个)
xxxxxxxxxx<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><html><head><title>小滴课堂</title></head><body><h4><%=request.getRequestURL()%></h4></html>
愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介:讲解 HttpServletRequest 请求对象
怎样添加servlet-api源码
下载:https://tomcat.apache.org/download-90.cgi ,选择:Source Code Distribution
添加:解压包,然后idea选择chose source code,选择java这层包就可以
HttpServletRequest对象
API测试
xxxxxxxxxxhttp://127.0.0.1:8080/request?userName=jack&age=11&sport=ball&sport=sleep//客户端请求信息System.out.println("应用上下文路径getContextPath="+request.getContextPath()) ;System.out.println("客户端发出请求时的完整URL getRequestURL="+request.getRequestURL()) ;System.out.println("请求行中的资源名部分 getRequestURI="+request.getRequestURI()) ;System.out.println("请求行中的参数部分 getQueryString="+request.getQueryString()) ;System.out.println("发出请求的客户机的IP地址 getRemoteAddr="+request.getRemoteAddr()) ;System.out.println("客户机发请求使用的网络端口号 getRemotePort="+request.getRemotePort()) ;//获取请求头System.out.println("获取请求头 getHeader(Accept)="+request.getHeader("Accept")) ;//获取请求参数System.out.println("客户端请求参数 getParameter="+request.getParameter("userName"));String[] sport = request.getParameterValues("sport");System.out.println("客户端请求参数列表,多个值 getParameterValues="+sport.toString());Map<String,String[]> map = request.getParameterMap();System.out.println("客户端请求参数封装成的map类型 getParameterMap="+map.toString());
四大作用域对象:PageContext->【ServletRequest】->HttpSession->ServletContext;
xxxxxxxxxx//ServletRequest作用域:对像生命周期存在一次请求里面//存储java对象到request作用域request.setAttribute("name","jack");
简介:讲解 HttpServletRequest和表单提交实战
xxxxxxxxxx<form action="/user/loin" method="post"><div>用户名: <input type="text" name="userName" /> </div><div>密码: <input type="password" name="pwd"/> </div><div> <input type="submit" value="登录"> </div></form>@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html;charset=utf-8");String userName = req.getParameter("userName");String pwd = req.getParameter("pwd");if(userName.equals("xdclass") && pwd.equals("123")){resp.getWriter().write("登录成功");}else {resp.getWriter().write("账号密码错误");}}
xxxxxxxxxx//POST方式遇到中文乱码,如果客户端是以UTF-8字符编码,需要服务器以UTF-8的编码接收数据,req.setCharacterEncoding("UTF-8");//对于以get方式传输的中文数据乱码需要另外一种方式,默认的还是使用ISO8859-1这个字符编码来接收数据//办法:对接收到的原始数据的字节数组,然后通过字节数组以指定的编码构建字符串,解决乱码问题String name = request.getParameter("name");//接收数据name =new String(name.getBytes("ISO8859-1"), "UTF-8")
简介:讲解HttpServletResponse知识点
简介:代表服务器的响应,封装了向客户端发送数据、发送响应头,发送响应状态码的方法
常见API
xxxxxxxxxx//设置有多个值的http响应头,参数name表示响应头名称,参数value表示响应头的值,//比如:response.addHeader("name", "java");response.addHeader("name", "spring");addHeader(String name,String value)//设置只有一个值的http响应头,参数name表示响应头名称,参数value表示响应头的值setHeader(String name,String value)//设置http状态码response.setStatus(200);
getOutputStream():
xxxxxxxxxx//设置编码格式为UTF-8response.setCharacterEncoding("UTF-8");//通过设置响应头控制浏览器以UTF-8的编码显示数据,如果不加这句话,那么浏览器显示的将是乱码response.setHeader("Content-Type","text/html;charset=utf-8");String data = "小滴课堂java高级工程师成长系列";//获取OutputStream输出流OutputStream outputStream = response.getOutputStream();//将字符转换成字节数组,指定以UTF-8编码进行转换byte[] dataByteArr = data.getBytes("UTF-8");//使用OutputStream流向客户端输出字节数组outputStream.write(dataByteArr);
getWriter():
xxxxxxxxxx//设置编码格式为UTF-8response.setCharacterEncoding("UTF-8");//通过设置响应头控制浏览器以UTF-8的编码显示数据,如果不加这句话,那么浏览器显示的将是乱码response.setHeader("content-type", "text/html;charset=UTF-8");String data = "小滴课堂java高级工程师成长系列";//获取PrintWriter输出流PrintWriter out = response.getWriter();//使用PrintWriter流向客户端输出字符out.write(data);
愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介:讲解请求转发RequestDispatcher的知识点
什么是请求转发:
xxxxxxxxxxrequest.getRequestDispatcher(URL地址).forward(request, response)

注意点:在浏览器地址栏中不会显示出转发后的地址,属于服务器内部转发,整个过程处于同一个请求当中,所以转发中数据的存取可以用request作用域
xxxxxxxxxx//存储java对象到request作用域,转发后一样可以获取到值,具体怎么获取?JSP或者EL表达式request.setAttribute("name","jack");
简介:介绍EL表达式
xxxxxxxxxxEL表达式的格式都是以 ${ }表示。例如 $ {userinfo}代表获取变量userinfo的值,${对象.属性},可以有多层操作当EL表达式中的变量不给定范围时,则默认在page范围查找,然后依次在request、session、application范围查找,如果找到不再继续找下去,但是假如全部的范围都没有找到时,就回传""可以用范围作为前缀表示属于哪个范围的变量,例如:${pageScope.userinfo}表示访问page范围中的userinfo变量
属性范围在EL中的名称
xxxxxxxxxx【jsp中】【EL表达式中】Page pageScopeRequest requestScopeSession sessionScopeApplication applicationScope
对比:
案例:在reqeust中设置值,然后在请求转发到页面,使用EL表达式取值
简介:讲解请求重定向sendRedirect
什么是请求重定向

注意点:
重定向是取不到request中的存储的数据,如果当前servlet是重定向,浏览器可以看到两个请求
调用sendRedirect()方法,会在响应中设置Location响应报头,这个过程对于用户来说是透明的,浏览器会自动完成新的访问
愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介:介绍web开发核心技术之Cookie介绍和使用
cookie介绍
解决方案:
浏览器发送request请求到服务器,服务器除了返回请求的response之外,还给请求分配一个唯一标识ID和response一并返回给浏览器
服务器在本地创建一个map结构,专门以key-value存储这个ID标识和浏览器的关系
当浏览器的第一次请求后已经分配一个ID,当第二次访问时会自动带上这个标识ID,服务会获取这个标识ID去map里面找上一次request的信息状态且做对应的更新操作 服务端生成这个全局的唯一标识,传递给客户端用于标记这次请求就是cookie; 服务器创建的那个map结构就是session。
cookies由服务端生成,用于标记客户端的唯一标识,在每次网络请求中,都会被传送。
session服务端自己维护的一个map数据结构,记录key-Object上下文内容状态
核心:它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie使基于无状态的HTTP协议记录稳定的状态信息成为了可能。 浏览器查看多个站点的cookie
cookie的属性
Name : 名称
Value : 值
Domain:表示当前cookie所属于哪个域或子域下面
Expires/Max-age:表示了cookie的有效期,是一个时间,过了这个时间,该cookie就失效了
Path:表示cookie的所属路径。
size: 大小,多数浏览器都是4000多个字节
http-only: 表示这个cookie不能被客户端使用js读取到,是不公开的cookie
Secure: 标记为 Secure 的Cookie只应通过被HTTPS协议加密过的请求发送给服务端,
SameSite(特有的,可以忽略)
Cookie的缺陷
浏览器允许每个域名所包含的cookie数量?
简介:javaweb操作浏览器cookie
xxxxxxxxxxCookie[] cookies = request.getCookies();for(Cookie cookie : cookies){cookie.getDomain();}private final String name;private String value;private int version = 0; // ;Version=1 ... means RFC 2109 style//// Attributes encoded in the header's cookie fields.//private String comment; // ;Comment=VALUE ... describes cookie's useprivate String domain; // ;Domain=VALUE ... domain that sees cookieprivate int maxAge = -1; // ;Max-Age=VALUE ... cookies auto-expireprivate String path; // ;Path=VALUE ... URLs that see the cookieprivate boolean secure; // ;Secure ... e.g. use SSLprivate boolean httpOnly; // Not in cookie specs, but supported by browsers
响应返回cookie
xxxxxxxxxxCookie cookie = new Cookie("token","sfwerawefewadaewfafewafa");//20秒过期时间,过期后不会自动携带过去cookie.setMaxAge(20);response.addCookie(cookie);request.getRequestDispatcher("/index.jsp").forward(request,response);
js获取cookie,可以获取token,但是获取不到JSESSIONID,因为 http-only原因
简介:web开发Session知识
什么是Session
生成和使用流程(和Cookie知识点一样,两者互相配合)
总结:
使用场景:记录用户的登录状态、权限等

session的现状
session是存储在服务端的内存中,在javaweb里面叫HttpSession也是一个作用域
PageContext(页面)->ServletRequest(请求)->【HttpSession】(会话)->ServletContext(一个应用)
是可以存储很多key-value的,作用域比较广,所以也不能存储过多内容,因为内存是有限制的,互联网企业使用比较少,传统IT公司使用比较多
知识延伸:
简介:讲解HttpSession知识开发用户登录实战
HttpSession 类操作api介绍:
xxxxxxxxxxHttpSession session = request.getSession();//获取sessionid,java里面叫jsessionidSystem.out.println("sessionid="+session.getId());//创建时间戳,毫秒System.out.println("getCreationTime="+session.getCreationTime());//是否是初次创建,记得情况浏览器的cookie,验证sessionidSystem.out.println("isNew="+session.isNew());//往session存储东西session.setAttribute("name","小滴课堂 xdclass.net");
xxxxxxxxxxprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String name = req.getParameter("name");String pwd = req.getParameter("pwd");if(name.equals("xdclass") && pwd.equals("123")){User user = new User();user.setId(121);user.setName(name);user.setHost("xdclass.net");req.getSession().setAttribute("loginUser",user);req.getRequestDispatcher("/WEB-INF/user.jsp").forward(req,resp);}else{req.setAttribute("msg","账号密码错误");req.getRequestDispatcher("/login.jsp").forward(req,resp);}}
xxxxxxxxxx<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>Title</title></head><body><form action="<%=request.getContextPath()%>/loginServlet" method="post">名称:<input type="text" name="name"/><br/>密码:<input type="password" name="pwd"/><input type="submit" value="登录">消息提示 ${msg}</form></body></html>
xxxxxxxxxx<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>Title</title></head><body>id:${loginUser.id}<br>name:${loginUser.name}<a href="/logout_servlet">退出</a></body></html>
xxxxxxxxxx<session-config><session-timeout>30</session-timeout></session-config>
愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介:讲解JavaWeb核心知识之过滤器Filter
什么是过滤器:(检验是否符合要求,或者 对内容做二次处理,设置编码响应等)
Servlet里面的过滤器作用
Filter的生命周期
元注解: @WebFilter
xxxxxxxxxx//该Filter是否支持异步操作模式asyncSupported//指定Filter对那种dispatcher模式进行过滤 该属性支持 Async,Error Forward,include,requestdispatcherType//Filter 显示的名称displayName//Filter的名称filterName//Filter的配置参数initParams//过滤的Servlet可以指定多个,表示对这几个特定的的servlet 进行过滤servletNames//指定 Filter拦截的 URL,和上面的servletNames配置一样,用*可以表示通配符,但是不用字母后加*,应该按照模块划分,比如/user/*urlPatterns/value
xxxxxxxxxx@WebFilter(filterName = "xxx",urlPatterns = {"/*"})public class CustomFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("CustomFilter init ");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("CustomFilter doFilter ");request.setCharacterEncoding("UTF-8");response.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=utf-8");//让请求继续往下走chain.doFilter(request,response);}@Overridepublic void destroy() {System.out.println("CustomFilter destroy ");}}
简介:讲解JavaWeb核心知识之过滤器Filter
FilterConfig类:
dispatcherTypes 参数
指定Filter对那种dispatcher模式进行过滤,不符合的则不进行过滤
实操
xxxxxxxxxx@WebFilter(filterName = "xxx",urlPatterns = {"/*"},initParams = {@WebInitParam(name = "encoding",value = "UTF-8"),@WebInitParam(name = "loginPage",value = "/login.jsp"),},dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.FORWARD})public class CustomFilter implements Filter {private FilterConfig filterConfig;private String encoding;private String loginPage;@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("CustomFilter init ");this.filterConfig = filterConfig;String filterName = filterConfig.getFilterName();System.out.println("filterName="+filterName);this.encoding = filterConfig.getInitParameter("encoding");this.loginPage = filterConfig.getInitParameter("loginPage");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("CustomFilter doFilter ");request.setCharacterEncoding(encoding);response.setCharacterEncoding(encoding);response.setContentType("text/html;charset=utf-8");//让请求继续往下走chain.doFilter(request,response);}@Overridepublic void destroy() {System.out.println("CustomFilter destroy ");}}
简介:过滤实战之用户登录访问订单页面
xxxxxxxxxx@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String name = req.getParameter("name");String pwd = req.getParameter("pwd");if(name.equals("xdclass") && pwd.equals("123")){User user = new User();user.setId(121);user.setName(name);user.setHost("xdclass.net");req.getSession().setAttribute("loginUser",user);req.getRequestDispatcher("/WEB-INF/user.jsp").forward(req,resp);}else{req.setAttribute("msg","账号密码错误");req.getRequestDispatcher("/login.jsp").forward(req,resp);}}
开发登录过滤器
xxxxxxxxxx@WebFilter(filterName = "loginFilter",urlPatterns = {"/user/*","/order/*"},initParams = {@WebInitParam(name = "encoding",value = "UTF-8"),@WebInitParam(name = "loginPage",value = "/login.jsp"),})public class LoginFilter implements Filter {private FilterConfig filterConfig;private String encoding;private String loginPage;@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("CustomFilter init ");this.filterConfig = filterConfig;this.encoding = filterConfig.getInitParameter("encoding");this.loginPage = filterConfig.getInitParameter("loginPage");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("CustomFilter doFilter ");request.setCharacterEncoding(encoding);response.setCharacterEncoding(encoding);response.setContentType("text/html;charset=utf-8");HttpServletRequest httpServletRequest = (HttpServletRequest)request;HttpServletResponse httpServletResponse = (HttpServletResponse)response;//session里面有用户信息if(httpServletRequest.getSession().getAttribute("loginUser") !=null){chain.doFilter(request,response);}else {httpServletRequest.setAttribute("msg","非法访问,请登录");httpServletRequest.getRequestDispatcher(loginPage).forward(httpServletRequest,httpServletResponse);}}@Overridepublic void destroy() {System.out.println("CustomFilter destroy ");}}
登录界面 login.jsp
xxxxxxxxxx<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>Title</title></head><body><form action="<%=request.getContextPath()%>/loginServlet" method="post">名称:<input type="text" name="name"/><br/>密码:<input type="password" name="pwd"/><input type="submit" value="登录">消息提示 ${msg}</form></body></html>
用户信息界面/user.jsp
xxxxxxxxxx<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>Title</title></head><body>id:${loginUser.id}<br>name:${loginUser.name}<a href="/logout_servlet">退出</a></body></html>
愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介:讲解Servlet里面的监听器Listener
什么是监听器:

javaweb里面的监听器:
作用:监听域对象的创建和销毁,比如request/session/context
分类:
监听器的实现步骤:
(1)创建一个普通的Java类
(2)让该类实现监听器的接口
(3)在该类中实现监听器接口的所有方法
(4)旧版的在web.xml文件中通过
简介:实战自定义ServletContext监听器
使用场景:加载全局配置,初始化项目信息
web.xml配置
xxxxxxxxxx<context-param><param-name>url</param-name><param-value>https://xdclass.net</param-value></context-param><context-param><param-name>topic</param-name><param-value>小滴课堂java高级工程师成长专题视频</param-value></context-param>
监听器开发
xxxxxxxxxx@WebListenerpublic class ContextListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {System.out.println("ContextListener contextInitialized");ServletContext servletContext = sce.getServletContext();String url = servletContext.getInitParameter("url");String topic = servletContext.getInitParameter("topic");Config config = new Config();config.setTopic(topic);config.setUrl(url);servletContext.setAttribute("config",config);}@Overridepublic void contextDestroyed(ServletContextEvent sce) {System.out.println("ContextListener contextDestroyed");}}
简介:java监听器实战之HttpSessionListener统计当前在线人数
session使用场景
ContextLisener配置
xxxxxxxxxx//获取上下文对象ServletContext sc = sce.getServletContext();sc.setAttribute("onlineNum",0);
HttpSessionListener开发
xxxxxxxxxx@WebListenerpublic class SessionListener implements HttpSessionListener {@Overridepublic void sessionCreated(HttpSessionEvent se) {System.out.println("SessionListener sessionCreated");ServletContext servletContext = se.getSession().getServletContext();//获取在线人数Integer onlineNum = (Integer)servletContext.getAttribute("onlineNum");//新增1servletContext.setAttribute("onlineNum",++onlineNum);}@Overridepublic void sessionDestroyed(HttpSessionEvent se) {System.out.println("SessionListener sessionDestroyed");ServletContext servletContext = se.getSession().getServletContext();//获取在线人数Integer onlineNum = (Integer)servletContext.getAttribute("onlineNum");//减少1servletContext.setAttribute("onlineNum",--onlineNum);}}
add.jsp
xxxxxxxxxx<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>小滴课堂javaweb统计在线人数</title></head><body><hr>近30分钟在线人数: ${applicationScope.onlineNum}</body></html>
delete.jsp
xxxxxxxxxx<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>小滴课堂 xdclass.net 专题课程</title></head><body>销毁session<hr><% request.getSession().invalidate(); %></body></html>
注意:
简介:实战ServletRequestListener统计网站请求量
ContextLisener配置
xxxxxxxxxx//获取上下文对象ServletContext sc = sce.getServletContext();sc.setAttribute("onlineNum",0);sc.setAttribute("totalVisit",0);
RequestListener开发
xxxxxxxxxx@WebListenerpublic class SessionListener implements HttpSessionListener {@Overridepublic void sessionCreated(HttpSessionEvent se) {System.out.println("SessionListener sessionCreated");ServletContext servletContext = se.getSession().getServletContext();//获取在线人数Integer onlineNum = (Integer)servletContext.getAttribute("onlineNum");//新增1servletContext.setAttribute("onlineNum",++onlineNum);}@Overridepublic void sessionDestroyed(HttpSessionEvent se) {System.out.println("SessionListener sessionDestroyed");ServletContext servletContext = se.getSession().getServletContext();//获取在线人数Integer onlineNum = (Integer)servletContext.getAttribute("onlineNum");//减少1servletContext.setAttribute("onlineNum",--onlineNum);}}
add.jsp
xxxxxxxxxx<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>小滴课堂javaweb统计在线人数</title></head><body><hr>近30分钟在线人数: ${applicationScope.onlineNum}<hr>应用服务器启动后总访问次数:${totalVisit}</body></html>
愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介:讲解Javaweb文件上传
javaweb文件上传
前端开发 1)表单的提交方法必须是post 2)需要声明是一个文件上传组件 3)必须设置表单的enctype="multipart/form-data
xxxxxxxxxx<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>小滴课堂文件上传样例</title></head><body><form action="<%=request.getContextPath()%>/fileUpload" method="post" enctype="multipart/form-data">用户名:<input type="text" name="username"/>头像:<input type="file" name="img"><input type="submit" value="提交"></form></body></html>
后端开发
xxxxxxxxxx@WebServlet("/fileUpload")@MultipartConfigpublic class FileUploadServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String username = request.getParameter("username");System.out.println("username="+username);Part part = request.getPart("img");//获取真实文件名称String header = part.getHeader("content-disposition");String realFileName = header.substring(header.indexOf("filename=")+10,header.length()-1);System.out.println("realFileName="+realFileName);//获取真实的文件内容InputStream is = part.getInputStream();//web-inf目录外界不能直接访问,如果文件机密性强则放这里//String dir = this.getServletContext().getRealPath("/WEB-INF/file");String dir = this.getServletContext().getRealPath("/file");File dirFile = new File(dir);//如果目录不存在,则创建if(!dirFile.exists()){dirFile.mkdirs();}String uniqueName = UUID.randomUUID()+realFileName;//文件流拷贝//File file = new File(dir,realFileName);File file = new File(dir,uniqueName);FileOutputStream out = new FileOutputStream(file);byte[] buf = new byte[1024];int len;while ((len = is.read(buf))!=-1 ){out.write(buf,0,len);}out.close();is.close();//图片访问request.getRequestDispatcher("/file/"+uniqueName).forward(request,response);}}
注意点:
互联网公司里面的文件服务器:
简介:讲解 javaweb的文件下载讲解
javaweb文件下载
后端开发
客户端发送请求给服务端告诉服务端需要下载的文件,服务端读取该文件转换为输入流,在通过outputstream响应给客户端,需要设置response的头信息
xxxxxxxxxx@WebServlet("/download")public class FileDownloadServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//客户端传递需要下载的文件名String file = request.getParameter("file");//获取文件在我们项目中的路径,发布到tomcat的实际路径String path = request.getServletContext().getRealPath("/file/");String filePath = path+file;FileInputStream fis = new FileInputStream(filePath);response.setCharacterEncoding("UTF-8");//指明响应的配置信息,包含附件response.setHeader("Content-Disposition","attachment; filename="+file);//如果文件名不包含中文可以不设置该项//如果包含中文名,则需要设置编码,否则文件名下载后中文字符会乱码//getBytes指定了编码的方式,ISO-8859-1指定了解码(读取)的方式,想要转换编码,就是先编码,再解码//response.setHeader("Content-Disposition","attachment; filename="+new String(file.getBytes("gb2312"),"ISO-8859-1"));ServletOutputStream out = response.getOutputStream();byte[] buf = new byte[1024];int len;while ((len= fis.read(buf))!=-1){out.write(buf,0,len);}out.close();}}
前端开发
xxxxxxxxxx<a href="<%=request.getContextPath()%>/download?file=test1.png">下载</a>
愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介: 讲解Model-视图View-控制器Controller模型知识
什么是MVC
Model 模型
View 视图
Controller 控制器

简介: 讲解三层结构知识
三层架构
软件包划分:
视图层 View也叫web层
服务层 Service
持久层 Dao (Data Access Object)

简介:讲解互联网公司项目常见的src目录结构
常见的src目录结构
controller 存放控制器
service 存放业务接口
dao 存放数据访问接口
domain 存放实体类
util 存放工具类
listener 存放监听器
filter 存放过滤器
config 存放配置
愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介:讲解什么是JDBC和相关介绍
什么是JDBC

JDBC连接MySQL相关概念
使用Java连接Mysql的步骤
简介:准备数据库表相关的
基础环境:
自己搭建好Mysql数据库,推荐是Mysql5.7版本
注意 如果连接不上数据库
准备Mysql客户端软件
Mysql驱动jar包导入
mysql数据库表建立
xxxxxxxxxxCREATE TABLE `user` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`phone` varchar(32) DEFAULT NULL,`pwd` varchar(128) DEFAULT NULL,`sex` int(2) DEFAULT NULL,`img` varchar(128) DEFAULT NULL,`create_time` datetime DEFAULT NULL,`role` int(11) DEFAULT NULL COMMENT '1是普通用户,2是管理员',`username` varchar(128) DEFAULT NULL,`wechat` varchar(128) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;INSERT INTO `user` (`id`, `phone`, `pwd`, `sex`, `img`, `create_time`, `role`, `username`,`wechat`)VALUES(1,'123','666',1,'xdclass.net','2021-09-09 00:00:00',1,'jack','xdclass6'),(2,'2323432','794666918',1,'wwwww','2020-05-20 04:54:01',1,'小滴Anna姐姐','xdclass-anna'),(3,'2323432','xdclass-lw',1,'wwwww','2020-05-20 04:54:42',1,'二当家小D','xdclass1'),(4,'2323432','3232323',1,'wwwww','2020-05-20 04:55:07',1,'老王','xdclass-lw');
简介:快速使用jdbc连接Mysql
使用Java连接Mysql的步骤
加载JDBC驱动程序
建立数据库连接Connection
创建执行SQL的语句Statement
处理执行结果ResultSet
释放连接资源
xxxxxxxxxxpublic static void main(String [] args) throws Exception{//加载JDBC驱动程序Class.forName("com.mysql.jdbc.Driver");//建立数据库连接ConnectionString username = "root";String password = "xdclass.net";//协议:子协议://ip:端口/数据库名称?参数1=值1&参数2=值2String url = "jdbc:mysql://127.0.0.1:3306/xd_web?useUnicode=true&characterEncoding=utf-8&useSSL=false";Connection connection = DriverManager.getConnection(url,username,password);//创建执行SQL的语句StatementStatement statement = connection.createStatement();//处理执行结果ResultSetResultSet resultSet = statement.executeQuery("select * from user");while (resultSet.next()){System.out.println("用户名称 name="+ resultSet.getString("username") + " 联系方式 wechat="+ resultSet.getString("wechat"));}//释放连接资源resultSet.close();statement.close();connection.close();}
简介:讲解SQL注入攻击Statement预编译语句
什么是SQL注入攻击
PrepareStatement
字面可译为预声明,内部包含一个预编译的sql语句,参数采用占位符 ? 进行填充
为啥可以防注入
好处:维护性好、提高sql效率、增加安全性
简介:始终JDBC新增记录和删除记录功能
新增记录
xxxxxxxxxxPreparedStatement preparedStatement = connection.prepareStatement("insert into user(username, pwd,sex,role,create_time) values(?,?,?,?,?) ");preparedStatement.setString(1,"二当家小D");preparedStatement.setString(2,"123456");preparedStatement.setInt(3,1);preparedStatement.setInt(4,2);preparedStatement.setTimestamp(5,new Timestamp(System.currentTimeMillis()));//执行preparedStatement.execute();preparedStatement.close();connection.close();
删除记录
xxxxxxxxxxConnection connection = DriverManager.getConnection(url, username, password);PreparedStatement preparedStatement = connection.prepareStatement("delete from user where id=?");preparedStatement.setInt(1,2);//执行preparedStatement.execute();preparedStatement.close();connection.close();
简介:讲解JDBC控制Mysql事务
事务:
四大特性
事务的一些术语
JDBC事务控制实操
xxxxxxxxxxprivate static void testTransaction() throws Exception {//加载JDBC驱动程序Class.forName("com.mysql.jdbc.Driver");//建立数据库连接ConnectionString username = "root";String password = "xdclass.net";//协议:子协议://ip:端口/数据库名称?参数1=值1&参数2=值2String url = "jdbc:mysql://127.0.0.1:3306/xd_web?useUnicode=true&characterEncoding=utf-8&useSSL=false";Connection connection = DriverManager.getConnection(url, username, password);try (PreparedStatement ps1 = connection.prepareStatement("insert into user(username, pwd) values(?,?) ");PreparedStatement ps2 = connection.prepareStatement("insert into user(username, pwd) values(?,?) ")) {//JDBC中默认事务是自动提交的,false就不会自动提交connection.setAutoCommit(false);ps1.setString(1, "1111tranc ps 1二当家小D");ps1.setString(2, "123456");ps2.setString(1, "2222tranc ps 2二当家小D");ps2.setString(2, "123456");ps1.execute();//模拟异常int i = 1/0;ps2.execute();} catch (Exception e) {e.printStackTrace();//事务回滚connection.rollback();} finally {//事务提交connection.commit();connection.close();}}
愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介:自定义DBUtils工具类封装
xxxxxxxxxx/*** DB工具类* 小滴课堂 https://xdclass.net* 讲师微信:xdclass6**/public class CustomDBUtil {private static String url;private static String username;private static String password;private static String driver;static {try {Properties properties = new Properties();properties.load(CustomDBUtil.class.getClassLoader().getResourceAsStream("db.properties"));url = properties.getProperty("url");username = properties.getProperty("username");password = properties.getProperty("password");driver = properties.getProperty("driver");//加载JDBC驱动程序Class.forName(driver);}catch (Exception e){e.printStackTrace();}}/**** 小滴课堂 https://xdclass.net* 讲师微信:xdclass6** 获取连接* @return* @throws Exception*/public static Connection getConnection() throws Exception{Connection connection = DriverManager.getConnection(url,username,password);return connection;}/*** 小滴课堂 https://xdclass.net* 讲师微信:xdclass6** 关闭数据库资源* @param resultSet* @param ps* @param connection*/public static void close(ResultSet resultSet, PreparedStatement ps, Connection connection){try{if(resultSet!=null){resultSet.close();}if(ps!=null){ps.close();}if(connection!=null){connection.close();}}catch (SQLException e){throw new RuntimeException();}}}
简介: 数据库连接池化思想
为什么要用连接池
同类对比其他池化思想

简介: Javaweb基础+JDBC知识点回顾
http基础
tomcat
javaweb
JDBC
简介:介绍市面上常见的DB工具类和数据连接池
数据库工具类 : Apache commens-dbutils
Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,能极大简化jdbc编码的工作量,同时也不会影响程序的性能
导入
数据库连接池:c3p0、druid、dbcp
愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介:Apache dbcp数据库连接池封装DataSourceUtils实战
配置
xxxxxxxxxxdriverClassName = com.mysql.jdbc.Driverurl = jdbc:mysql://127.0.0.1:3306/xd_web?useUnicode=true&characterEncoding=utf-8&useSSL=falseusername = rootpassword = xdclass.netinitialSize=2 //连接池建立时创建的连接的数量maxActive=15 //连接池同一时间内最多能够分配的活动连接的数量
工具类开发
xxxxxxxxxxpublic class DataSourceUtil {private static DataSource dataSource;static {try{InputStream in = DataSourceUtil.class.getClassLoader().getResourceAsStream("database.properties");Properties p = new Properties();p.load(in);dataSource = BasicDataSourceFactory.createDataSource(p);}catch (Exception e){e.printStackTrace();throw new ExceptionInInitializerError("初始化DBPC失败");}}public static DataSource getDataSource(){return dataSource;}}
简介:Apache dbutils工具快速入门实战
DbUtils 中的核心类/接口
QueryRunner
查询执行器,提供对sql语句操作的API
update(String sql,Object...params) 可执行 增-INSERT、删-DELETE、改-UPDATE
query(String sql,ResultSetHandler
ResultSetHandler
结果集处理类,执行处理一个结果集对象,将数据转变并处理为任何一种形式
例子
xxxxxxxxxxQueryRunner queryRunner = new QueryRunner(DataSourceUtil.getDataSource());public User findById(int id) {String sql = "select * from user where id = ? ";User user = null;try {user = queryRunner.query(sql,new BeanHandler<>(User.class,processor),id);} catch (SQLException e) {e.printStackTrace();}return user;}
简介:BeanHandler和BeanListHandler多个结果集处理器实战
xxxxxxxxxx/*** 小滴课堂jdbc实战** 根据id找用户** @param id* @return*/public User findById(int id){String sql = "select * from user where id=?";User user = null;try {user = queryRunner.query(sql,new BeanHandler<>(User.class,processor),id);} catch (SQLException e) {e.printStackTrace();}return user;}
xxxxxxxxxx//开启驼峰映射private BeanProcessor bean = new GenerousBeanProcessor();private RowProcessor processor = new BasicRowProcessor(bean);
xxxxxxxxxxpublic List<User> list(){String sql = "select * from user";List<User> list = null;try {list = queryRunner.query(sql,new BeanListHandler<>(User.class,processor));} catch (SQLException e) {e.printStackTrace();}return list;}
简介:MapHandler和ScalarHandler结果集处理器实战
MapHandler : 结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值
xxxxxxxxxx/*** 小滴课堂jdbc实战* 有问题加讲师微信: xdclass6* 根据id找用户 MapHandler** @param id* @return*/public Map<String,Object> findByIdWithMap(int id){String sql = "select * from user where id=?";Map<String,Object> map = null;try {map = queryRunner.query(sql,new MapHandler(),id);} catch (SQLException e) {e.printStackTrace();}return map;}
MapListHandler : 结果集中的每一行数据都封装到一个Map里,然后再存放到List
xxxxxxxxxx/*** 小滴课堂jdbc实战 https://xdclass.net* 有问题加讲师微信: xdclass6* 查找全部用户 MapListHandler** @return*/public List<Map<String,Object>> listWithMap(){String sql = "select * from user";List<Map<String,Object>> list = null;try {list = queryRunner.query(sql,new MapListHandler());} catch (SQLException e) {e.printStackTrace();}return list;}
ScalarHandler : 结果集中第一行数据指定列的值,常用来进行单值查询
xxxxxxxxxxpublic int countUser(){String sql = "select count(*) from user";Long count = null;try{count = (Long)queryRunner.query(sql,new ScalarHandler<>());}catch (Exception e){e.printStackTrace();}return count.intValue();}
简介:QueryRunner新增记录update实战
update新增
xxxxxxxxxxpublic int save(User user) throws Exception {String sql = "insert into user (phone,pwd,sex,img,create_time,role,username,wechat) values(?,?,?,?,?,?,?,?)";Object [] params = {user.getPhone(),user.getPwd(),user.getSex(),user.getImg(),user.getCreateTime(),user.getRole(),user.getUsername(),user.getWechat()};// String sql = "delete from user where id= ?";// Object [] params = { 1};int i = 0;try{i = queryRunner.update(sql,params);}catch (Exception e){e.printStackTrace();throw new Exception();}return i;}
愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介:介绍Maven,使用前后区别
什么是Maven
Apache组织开源的项目,一个软件项目管理和综合工具,基于项目对象模型(POM)的概念
使用前:找依赖包,下载,添加到lib包,添加的build path
使用后:直接maven仓库添加配置,指定版本,自动下载
核心目录:bin/mvn
环境要求:JDK1.8以上, mac/win/linux都是可以的
简介:Maven环境变量配置-Win10版


简介:Maven环境变量配置-Mac版
xxxxxxxxxxexport MAVEN_HOME=/Users/xdclass/Documents/software/apache-maven-3.6.3export PATH=$PATH:$MAVEN_HOME/bin
简介:讲解Maven的仓库概念和生命周期
Maven仓库
本地仓库: 用户目录下/.m2/repository/
远程仓库
中央仓库
私服
添加依赖包后

什么是Maven生命周期
对所有的构建过程进行抽象和统一,包括项目清理、初始化、编译、测试、打包、验证和部署等几乎全部步骤
三个标准生命周期
clean 清理项目
build 构建处理项目
site 项目文档创建处理
简介:使用Maven创建java项目
简介:讲解Maven核心配置文件pom.xml
xxxxxxxxxx<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><!-- 模型版本 --><modelVersion>4.0.0</modelVersion><!--公司或者组织的唯一标志,一般是网站名称反过来写--><groupId>net.xdclass</groupId><!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 --><artifactId>web-demo</artifactId><!-- 项目版本号 --><version>0.0.1</version><!-- 项目打包形式,常见的是 war、jar--><packaging>jar</packaging><!--项目名称--><name>xd_video</name><!--项目描述--><description>Demo project for Spring Boot</description><!--依赖--><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1.1</version></dependency></dependencies></project>
简介:介绍maven创建java项目的目录结构和常用指令
src
main
java - java文件
resources - 资源库
webapp
WEB-INF
css、js、html等静态文件
test
target :存放项目构建后的文件和目录。比如jar包、war包、编译的class文件等
maven常用命令
install和package的区别
maven常用参数
-D 指定参数,-Dmaven.test.skip=true 跳过单元测试
-p 指定profile配置,用于区分环境
web项目命令
mvn tomcat:run 启动tomcat
愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介: 概述互联网公司软件开发流程
软件开发流程
需求分析
设计
开发
测试
上线
多次迭代更新
简介:小滴课堂开发者论坛效果演示和需求分析
愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介:小滴课堂开发者论坛数据库ER图设计
什么是ER图
实体
属性
关系
任何事物都不是孤立存在的,事物内部和事物之间都有联系的,实体之间的联系通常有3种类型:一对一联系,一对多联系,多对多联系;比如商品和订单的关系、班级和学生的关系、主题和评论的关系
ER图里用菱形表示,菱形框内写明联系名,并用无向边分别与有关实体连接起来

简介:小滴课堂开发者论坛数据库设计
cateogry分类表
xxxxxxxxxxCREATE TABLE `category` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(128) DEFAULT NULL,`weight` int(11) DEFAULT NULL,`create_time` datetime DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4;
topic主题表
xxxxxxxxxxCREATE TABLE `topic` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`c_id` int(11) DEFAULT NULL COMMENT '分类',`title` varchar(128) DEFAULT NULL COMMENT '标题',`content` varchar(1024) DEFAULT NULL COMMENT '内容',`pv` int(11) DEFAULT NULL COMMENT '浏览量',`user_id` int(11) DEFAULT NULL,`username` varchar(64) DEFAULT NULL,`user_img` varchar(128) DEFAULT NULL,`create_time` datetime DEFAULT NULL,`update_time` datetime DEFAULT NULL,`hot` int(2) DEFAULT '0' COMMENT '是否热门 1是热门',`delete` int(11) DEFAULT '0' COMMENT '0是未删除,1是一件删除',PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
reply回复表
xxxxxxxxxxCREATE TABLE `reply` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`topic_id` int(11) DEFAULT NULL,`floor` int(11) DEFAULT NULL COMMENT '楼层编号,回复是不能删除的',`content` varchar(524) DEFAULT NULL COMMENT '回复内容',`user_id` int(11) DEFAULT NULL,`username` varchar(64) DEFAULT NULL COMMENT '回复人名称',`user_img` varchar(128) DEFAULT NULL COMMENT '回复人头像',`create_time` datetime DEFAULT NULL,`update_time` datetime DEFAULT NULL,`delete` int(11) DEFAULT NULL COMMENT '0是正常,1是禁用',PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
user用户表
xxxxxxxxxxCREATE TABLE `user` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`phone` varchar(32) DEFAULT NULL,`pwd` varchar(128) DEFAULT NULL,`sex` int(2) DEFAULT NULL,`img` varchar(128) DEFAULT NULL,`create_time` datetime DEFAULT NULL,`role` int(11) DEFAULT NULL COMMENT '1是普通用户,2是管理员',`username` varchar(128) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
sql文件在我们这章这集的资料里面,可以直接导入
愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介:IDEA+Maven3.x创建Javaweb项目配置tocmat9
简介: 小滴课堂开发者论坛相关依赖包和实体类开发
maven依赖包添加
xxxxxxxxxx<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.41</version></dependency><!-- JSP --><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.2</version><scope>provided</scope></dependency><!-- https://mvnrepository.com/artifact/commons-dbutils/commons-dbutils --><dependency><groupId>commons-dbutils</groupId><artifactId>commons-dbutils</artifactId><version>1.7</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-dbcp2</artifactId><version>2.7.0</version></dependency><!-- https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils --><dependency><groupId>commons-beanutils</groupId><artifactId>commons-beanutils</artifactId><version>1.9.4</version></dependency>
包结构创建
实体类开发
工具类开发
简介: 封装通用BaseServlet和分类列表接口开发
开发Controller
开发Service
开发Dao层
使用PostMan测试
简介:主题列表接口开发和通用PageDTO开发
什么是分页接口
数据过多,一页显示不过来,就会分页请求;
核心:当前第几页、每页显示多少条、总条数
数据数据库查询使用
select * from table limit m,n m——是指记录的起始位置,从0开始,表示第一条记录。 n——是指从第m+1条开始,取n条。
select * from tablename limit 2,4 即取出第3条至第6条,4条记录
简介:小滴课堂开发者论坛主题详情页接口开发
愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介:讲解小滴课堂开发者论坛之用户注册接口
Servlet-Service-Dao层开发
user表使用phone唯一索引
xxxxxxxxxxCREATE TABLE `user` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`phone` varchar(32) DEFAULT NULL,`pwd` varchar(128) DEFAULT NULL,`sex` int(2) DEFAULT NULL COMMENT '0是女,1是男,2未知',`img` varchar(128) DEFAULT NULL,`create_time` datetime DEFAULT NULL,`role` int(11) DEFAULT NULL COMMENT '1是普通用户,2是管理员',`username` varchar(128) DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `phone` (`phone`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
MD5加密
xxxxxxxxxxpublic static String MD5(String data) {try {java.security.MessageDigest md = MessageDigest.getInstance("MD5");byte[] array = md.digest(data.getBytes("UTF-8"));StringBuilder sb = new StringBuilder();for (byte item : array) {sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));}return sb.toString().toUpperCase();} catch (Exception exception) {}return null;}
POSTMan测试 x-www-form-urlencoded格式
xxxxxxxxxx就是application/x-www-from-urlencoded,会将表单内的数据转换为键值对,&分隔。当form的action为get时,浏览器用x-www-form-urlencoded的编码方式,将表单数据编码为(name1=value1&name2=value2…),然后把这个字符串append到url后面,用?分隔,跳转到这个新的url。当form的action为post时,浏览器将form数据封装到http body中,然后发送到server
简介:讲解小滴课堂开发者论坛之用户登录和注销接口
xxxxxxxxxx//controller层代码public void login(HttpServletRequest request,HttpServletResponse response){String phone = request.getParameter("phone");String pwd = request.getParameter("pwd");User user = userService.login(phone,pwd);if(user != null){request.getSession().setAttribute("loginUser",user);//跳转页面}else {request.setAttribute("msg","用户名或者密码不正确");}}//service层代码@Overridepublic User login(String phone, String pwd) {String md5pwd = CommonUtil.MD5(pwd);User user = userDao.findByPhoneAndPwd(phone,md5pwd);return user;}//dao层代码public User findByPhoneAndPwd(String phone, String md5pwd) {String sql = "select * from user where phone=? and pwd=?";User user = null;try{user = queryRunner.query(sql,new BeanHandler<>(User.class,processor),phone,md5pwd);}catch (Exception e){e.printStackTrace();}return user;}
简介:小滴课堂开发者论坛发布主题接口开发
xxxxxxxxxx//controller层代码/*** http://localhost:8080/topic?method=addTopic* 发布主题* @param request* @param response*/public void addTopic(HttpServletRequest request,HttpServletResponse response){User loginUser = (User)request.getSession().getAttribute("loginUser");if(loginUser == null){request.setAttribute("msg","请登录");return;//页面跳转 TODO}String title = request.getParameter("title");String content = request.getParameter("content");int cId = Integer.parseInt(request.getParameter("c_id"));int rows = topicService.addTopic(loginUser,title,content,cId);if(rows ==1){//发布主题成功}else {//发布主题失败}}//service层代码@Overridepublic int addTopic(User loginUser, String title, String content, int cId) {Category category = categoryDao.findById(cId);if(category == null){ return 0;}Topic topic = new Topic();topic.setTitle(title);topic.setContent(content);topic.setCreateTime(new Date());topic.setUpdateTime(new Date());topic.setPv(1);topic.setDelete(0);topic.setUserId(loginUser.getId());topic.setUsername(loginUser.getUsername());topic.setUserImg(loginUser.getImg());topic.setcId(cId);topic.setHot(0);int rows = 0;try {rows = topicDao.save(topic);} catch (Exception e) {e.printStackTrace();}return rows;}//dao层代码public int save(Topic topic) throws Exception {String sql = "insert into topic(c_id,title,content,pv,user_id,username,user_img,create_time,update_time,hot,`delete`) " +"values(?,?,?,?,?,?,?,?,?,?,?)";Object [] params = {topic.getcId(),topic.getTitle(),topic.getContent(),topic.getPv(),topic.getUserId(),topic.getUsername(),topic.getUserImg(),topic.getCreateTime(),topic.getUpdateTime(),topic.getHot(),topic.getDelete()};int i =0;try{i= queryRunner.update(sql,params);}catch (Exception e){e.printStackTrace();throw new Exception();}return i;}
简介:小滴课堂开发者论坛盖楼回复功能开发
xxxxxxxxxx//controller层代码/*** http://localhost:8080/topic?method=replyByTopicId&topic_id=9* 盖楼回复* @param request* @param response*/public void replyByTopicId(HttpServletRequest request,HttpServletResponse response){User loginUser = (User)request.getSession().getAttribute("loginUser");if(loginUser == null){request.setAttribute("msg","请登录");return;//页面跳转 TODO}int topicId = Integer.parseInt(request.getParameter("topic_id"));String content = request.getParameter("content");int rows = topicService.replyByTopicId(loginUser,topicId,content);if(rows ==1){//回复成功}else {//回复失败}}//service层代码@Overridepublic int replyByTopicId(User loginUser, int topicId, String content) {int floor = topicDao.findLatestFloorByTopicId(topicId);Reply reply = new Reply();reply.setContent(content);reply.setCreateTime(new Date());reply.setUpdateTime(new Date());reply.setFloor(floor+1);reply.setTopicId(topicId);reply.setUserId(loginUser.getId());reply.setUsername(loginUser.getUsername());reply.setUserImg(loginUser.getImg());reply.setDelete(0);int rows = replyDao.save(reply);return rows;}//dao层代码public int save(Reply reply) {String sql = "insert into reply (topic_id,floor,content,user_id,username,user_img,create_time,update_time,`delete`)" +"values (?,?,?,?,?,?,?,?,?)";Object [] params = {reply.getTopicId(),reply.getFloor(),reply.getContent(),reply.getUserId(),reply.getUsername(),reply.getUserImg(),reply.getCreateTime(),reply.getUpdateTime(),reply.getDelete()};int rows = 0;try{rows = queryRunner.update(sql,params);}catch (Exception e){e.printStackTrace();}return rows;}
简介:小滴课堂开发者论坛阅读量递增
xxxxxxxxxx//controller层代码//处理浏览量,如果同个session内只算一次String sessionReadKey = "is_read_"+topicId;Boolean isRead = (Boolean) request.getSession().getAttribute(sessionReadKey);if(isRead == null){request.getSession().setAttribute(sessionReadKey,true);//新增一个pvtopicService.addOnePV(topicId);}//service层代码@Overridepublic void addOnePV(int topicId) {Topic topic = topicDao.findById(topicId);int newPV = topic.getPv()+1;topicDao.updatePV(topicId,newPV,topic.getPv());}//dao层代码/*** 更新浏览量*/public int updatePV(int topicId, int newPV, int oldPV) {String sql = "update topic set pv=? where pv=? and id=?";int rows = 0;try {rows = queryRunner.update(sql,newPV,oldPV,topicId);}catch (Exception e){e.printStackTrace();}return rows;}
愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介: 前端相关资源准备和文件创建
页面技术 bootstrap + jsp
xxxxxxxxxx<meta name="viewport" content="width=device-width, initial-scale=1"><link rel="stylesheet" href="${pageContext.request.contextPath}/static/bootstrap.min.css"><script src="${pageContext.request.contextPath}/static/bootstrap.min.js"></script><script src="${pageContext.request.contextPath}/static/jquery.min.js"></script>
pom文件添加依赖
xxxxxxxxxx<!-- https://mvnrepository.com/artifact/taglibs/standard --><dependency><groupId>taglibs</groupId><artifactId>standard</artifactId><version>1.1.2</version></dependency><!-- https://mvnrepository.com/artifact/javax.servlet/jstl --><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency>
jsp页面添加jstl表达式依赖包
xxxxxxxxxx<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
修改web.xml版本
xxxxxxxxxx<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/j2eehttp://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
简介:主题列表页开发和联调《上》
简介:主题列表页开发和联调《下》
简介:主题详情页开发和联调
简介:注册页面开发联调
简介:登录和退出页面开发联调
简介:发布主题页开发和联调
简介:回复盖楼页开发和联调
愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介:小滴课堂首页自动跳转配置
xxxxxxxxxx<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>小滴课堂开发者论坛</title></head><body><jsp:forward page="/topic?method=list&c_id=1"></jsp:forward></body></html>
xxxxxxxxxx<welcome-file-list><welcome-file>home.jsp</welcome-file></welcome-file-list>
简介:项目打包war部署外置tomcat和课程总结
备注:
愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介:讲解javaweb常见servlet面试题
说下servlet的生命周期
Servlet API中forward()和redirect()的区别
说下Cookie和Session的区别和联系
客户端存储除了Cookie,还有什么?
简介:讲解JDBC常见面试题
说下JDBC连接数据库的开发步骤
1.加载数据库连接驱动
2.获取数据连接对象
3.获取语句对象
会话对象有两种Statement和PreparedStatement
4.执行语句
5.处理结果集
6.关闭资源
rs.close()、st.close()、conn.close() 注意关闭顺序以及处理异常
JDBC中的Statement 和PreparedStatement的区别
数据库连接池工作原理和优点
先创建一定数量的连接对象存放在连接池
需要使用连接对象的时候,从连接池中请求一个空闲的连接
使用完毕之后,并不会把连接关闭,而是还给连接池
优点:
简介:讲解http常见面试题
http请求 get和post的区别?
浏览器输入一个地址,到页面展示中间经历了哪些处理
1、浏览器输入url, 解析url地址是否合法
2、浏览器检查是否有缓存, 如果有直接显示。如果没有跳到第三步。
3、在发送http请求前,需要域名解析(DNS解析),解析获取对应过的ip地址。
4、浏览器向服务器发起tcp链接,完成tcp三次握手
5、握手成功后,浏览器向服务器发送http请求
6、服务器收到处理的请求,将数据返回至浏览器
7、浏览器收到http响应。
8、浏览器解析响应。如果响应可以缓存,则存入缓存
9、浏览器进行页面渲染
302:重定向
404:请求失败,基本都是路径拼接错误
400:请求没有进入到后台服务里,比如http报文有问题
502:无效的响应(基本上就是Tomcat没启好或者挂了)
你知道http和https的区别不,简单说下
愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
简介:课程总结和学习路线规划
回顾目录和知识点
学习路线规划
学习建议
解决问题思路
javaee进阶课程 新版SSM


小滴课堂,愿景:让编程不在难学,让技术与生活更加有趣
相信我们,这个是可以让你学习更加轻松的平台,里面的课程绝对会让你技术不断提升
欢迎加小D讲师的微信: xdclass-lw
我们官方网站:https://xdclass.net
千人IT技术交流QQ群: 718617859
重点来啦:加讲师微信 免费赠送你干货文档大集合,包含前端,后端,测试,大数据,运维主流技术文档(持续更新)
https://mp.weixin.qq.com/s/qYnjcDYGFDQorWmSfE7lpQ