前提说明:本文笔记来自【狂神说java】JavaWeb课程内容,加上部分资料补充。
JavaWeb部分笔记1. 基本概念
1.1 Web:1.2 web应用程序:1.3 静态web1.4 动态web 2. web服务器(web Server)
2.1技术 3 Tomcat服务器
3.1 介绍3.2 发布web网站 4. http
4.1 http概念4.2 发展历史4.3 Http请求4.4 Http响应 5. Maven6. Servlet
6.1 servlet简介6.2 Hello Servlet6.3 Servlet原理6.4 Mapping映射问题:6.5 ServletContext6.6 HttpServletResponse6.7 HttpServletRequest 7. Session、cookie
7.1 会话(session)7.2 保存状态的技术(session, cookie) 8、 JSP
8.1 JSP概念 10. MVC三层架构11.Filter12. 监听器13 过滤器、监听器的常见应用
参考JavaWeb笔记
1. 基本概念 1.1 Web:
静态:
html, css数据不会发生变化
动态:
数据会改变技术栈:Servlet/JSP,ASP,PHP
动态web资源开发的技术称为Javaweb
1.2 web应用程序:web应用程序:供浏览器访问的程序含有多个web资源,对外提供服务URL:统一资源定位符(通过url进行访问程序)统一的web资源(html…)被放在同一文件下,一个web应用由多部分组成(静态/动态)
html, css, jsJsp, servletjar配置文件Properties
如果想外界访问,需要一个服务器进行统一管理
1.3 静态web缺点:
web页面无法动态更新,每时每刻都是同一个页面
动态页面:1.轮播图/特效(伪动态)2.javascript 不能和数据库交互(数据不能及时更新,用户无法交互) 1.4 动态web
缺点:
如果动态web资源出错,需要重新编写后台程序 优点:
动态动态资源与数据库交互(JDBC:Java数据库连接),数据可以持久化 2. web服务器(web Server) 2.1技术
JSP:JavaServer Pages, java服务器页面
JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。
servlet
解决高并发,高可用,高性能问题
3 Tomcat服务器 3.1 介绍web服务器:处理用户请求,并返回响应
Tomcat目录结构:
bin:存放tomcat命令脚本文件
conf:存放tomcat的配置信息。其中server.xml文件是核心的配置文件。
Server.xml:
可以配置启动的端口,默认端口8080
可以配置启动的主机名称,默认为localhost->127.0.0.1;默认网站应用存放的位置为webapps
lib:支持tomcat软件运行的jar包。其中还有技术支持包,如servlet,jsp
logs:运行过程的日志信息
temp:临时目录
webapps:共享资源目录。web应用目录。
work:tomcat的运行目录。
相关命令:
进入tomcat/bin目录下再执行命令 //打开tomcat sudo ./startup.sh //关闭tomcat sudo ./shutdown.sh // 访问http://localhost:8080/
PS:网站访问过程:
url域名解析:查找本地host文件是否有;有直接返回ip;没有通过DNS域名解析系统查找返回iptcp三次握手协议 3.2 发布web网站
网站结构:
—webapps : Tomcat服务器的web目录
-ROOT
-webName: 网站的目录名
- WEB-INF
-classes : java程序
-lib : web应用所依赖的jar包
-web.xml : 网站配置文件
-index.html 默认的首页
- static
- css
- style.css
- js
- img4
- ……
4. http
4.1 http概念
http: 超文本传输协议)
请求-响应协议运行在TCP上默认端口80
Https:以安全为目标的 HTTP
在HTTP 的基础下加入SSL默认端口443 4.2 发展历史
HTTP/1.0:非持久连接,客户端与web服务器连接后,只能进行一次请求,获得一个资源,请求结束后就断开连接HTTP/1.1:持久连接,客户端与web服务器连接后,仍然保持这条连接,可以进行多次请求,获得多个资源 4.3 Http请求
客户端-发送请求(request)-服务器
request方法:get, post, …
get: 携带参数少,大小有限制,在url会显示数据内容,不安全post: 携带参数没有限制,大小没有限制,在url不会显示数据内容,比较安全
request head(请求头):
Accept: 告诉浏览器,它所支持的数据类型 Accept-Encoding: 支持哪种编码格式 GBK UTF-8 GB2312 ISO8859-1 Accept-Language: 告诉浏览器,它的语言环境 Cache-Control: 缓存控制 Connection: 告诉浏览器,请求完成是断开连接还是保持连接 Host: 主机……/.4.4 Http响应
服务器-响应-客户端
响应体:
Accept: 告诉浏览器,它所支持的数据类型 Accept-Encoding: 支持哪种编码格式 GBK UTF-8 GB2312 ISO8859-1 Accept-Language: 告诉浏览器,它的语言环境 Cache-Control: 缓存控制 Connection: 告诉浏览器,请求完成是断开连接还是保持连接 Host: 主机……/. Refrush: 告诉客户端,多久刷新一次 Location:让网页重新定位
状态码:
2XX:成功3XX:重定向4XX:客户端错误,请求包含语法错误或无法完成请求5XX:服务器错误,服务器在处理请求的过程中发生了错误常见的状态码:
200 - 请求成功301 - 资源(网页等)被永久转移到其它URL404 - 请求的资源(网页等)不存在500 - 内部服务器错误
PS:当你在浏览器地址栏中输入地址并回车的一瞬间到页面展示回来,经历了什么?
1.域名解析 2.tcp3次握手建立连接 3.客户端发起http请求 4. 服务器响应http请求,浏览器得到html代码 5. 浏览器解析html代码,并请求html代码中的资源(css Javascript 图片) 6. 浏览器对页面进行渲染呈现5. Maven
5.1 作用
项目架构管理工具方便导入jar包
核心概念:约定大于配置。即,系统,类库,框架假定其合理的默认值,避免提供不必要的配置。在大部分情况下,使用框架提供的默认值会让项目运行的更快。
6. Servlet 6.1 servlet简介动态web开发技术步骤:实现servlet接口,部署到web服务器中
把实现了Servlet接口的Java程序叫做,Servlet
6.2 Hello Servlet1.创建普通的maven项目,删除src
2.创建Module模块
父项目中pom.xml:
servlet-01
父子项目关系类似于类继承,子项目可以用父项目的资源,父项目不能用子项目的独有的资源。
- Maven环境优化:
- 修改web.xml为最新配置在子模块中添加java和resoures文件夹
Web.xml:
web.xml文件是用来配置:欢迎页、servlet、filter等的。当你的web工程没用到这些时,你可以不用web.xml文件来配置你的web工程。
每个web.xml文件的根元素中,都必须标明这个web.xml使用的是哪个模式文件(Schema)。根据它的模式文件所定义的标签元素,它就能拥有定义出来的那些功能。
web.xml的模式文件中定义的标签并不是定死的,模式文件也是可以改变的,一般来说,随着web.mxl模式文件的版本升级,里面定义的功能会越来越复杂,标签元素的种类肯定也会越来越多,但有些不是很常用的,我们只需记住一些常用的并知道怎么配置就可以了。
Web.xml最新配置:
4.编写servlet程序
创建普通java类
实现Servlet接口,通过继承HttpServlet, GenericServlet(提供的Servlet实现类)
编写Servlet映射
为什么需要映射:我们写的Java程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所有我们需要在web服务中注册我们写的Servlet,还需要给他一个浏览器能够访问的路径;
hello
com.company.servlet.HelloServlet
hello
/hello
- 配置Tomcat启动测试
Servlet生命周期:
Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:
Servlet 初始化后调用 init () 方法。Servlet 调用 service() 方法来处理客户端的请求。Servlet 销毁前调用 destroy() 方法。最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
init() 方法:
init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用。
service() 方法:
service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。
service() 方法由容器调用,只需要重写 doGet() 或 doPost() 即可。
destroy() 方法:
destroy() 方法 关闭数据库连接、停止后台线程、把 cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。
6.4 Mapping映射问题:一个Servlet可以指定一个映射路径一个Servlet可以指定多个映射路径一个Servlet可以指定通用路径一个Servlet可以指定默认映射路径一个Servlet可以指定任意前缀或后缀(后缀前面不能加路径)
hello /hello hello /hello hello /hello2 hello /hello3 hello /hello4 hello /hello*.properties ***.properties ** public class CharacterEncodingFilter implements Filter { @Override //初始化:在Web服务器启动时就初始化,因为要随时监听,处理请求 public void init(FilterConfig filterConfig) throws ServletException { System.out.println("已经初始化"); } @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { //解决中文乱码 req.setCharacterEncoding("utf-8"); resp.setCharacterEncoding("utf-8"); resp.setContentType("text/html"); //请求继续执行,否则请求被拦截停止 chain.doFilter(req, resp); } @Override //销毁:web服务器关闭的时候销毁 public void destroy() { System.out.println("已经销毁"); } }
- web.xml下添加,配置filter:
ServletFilter com.company.servlet.ServletFilter ServletFilter /servlet //统计网站在线人数,即统计session(每个用户对应一个session) public class OnlineListener implements HttpSessionListener { @Override //创建sessionListener //一旦创建就会触发监听 public void sessionCreated(HttpSessionEvent se) { System.out.println(se.getSession().getId()); ServletContext ctx = se.getSession().getServletContext(); Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount"); if (onlineCount == null){ onlineCount = new Integer(1); }else{ int cnt = onlineCount.intValue(); onlineCount = new Integer(cnt+1); } ctx.setAttribute("OnlineCount", onlineCount); } @Override //销毁sessionListener public void sessionDestroyed(HttpSessionEvent hse) { ServletContext ctx = hse.getSession().getServletContext(); Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount"); if (onlineCount == null){ onlineCount = new Integer(1); }else{ int cnt = onlineCount.intValue(); onlineCount = new Integer(cnt-1); } ctx.setAttribute("OnlineCount", onlineCount); } }
注册监听器
com.company.servlet.OnlineListener
其他:因为tomcat启动时,构造出了多个ip向本机服务器发起tcp请求,所以导致多个会话,只要重新部署项目,重置刷新一下服务器的数据。
浏览器关了session并不会马上调用sessionDestroyed方法,session被destroyed只有两个途径,一个是session过期,还有一个就是显式调用session.invalidate()方法。(session.invalidate()不能写在destroy函数里)
当关闭浏览器的时候想要关闭session,可以使用Javascript捕获关闭浏览器的事件(onbeforeunload事件),然后发请求调用服务端的session的invalidate方法,之后就会调用sessiondestroy函数。
13 过滤器、监听器的常见应用监听器多用于图形化编程中监听事件发生XXXListener
过滤器实现权限拦截:
例:用户登录后进入主页,注销后不能进入(登录拦截)
用户登录后,向Session中放入用户的数据
进入主页的时候要判断用户是否已经登录,如果注销后,就不能再进入成功登录页面
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
Object user_session = req.getSession().getAttribute("USER_SESSION");
if(user_session == null){
resp.sendRedirect(req.getContextPath() + "/error.jsp");
}
filterChain.doFilter(req, resp);//必须加上chain.doFilter才能继续运行
}



