java web dev知识积累
tomcat体系结构
可以从tomcat的server.xml文件中元素的层次结构来理解tomcat的体系结构:
Server(可以视为tomcat本身)->经由connector可以有多个(coyote默认为Bio阻塞式io)处理socket分发->Service可以有多个(Catalina Container容器)(一般由catalina container来调用用户的web app java代码)->一个engine->多个host虚拟主机->多个context(就是web app)
每个由host定义的虚拟主机中可以定义多个context(也就是web app或者说modules)
war打包部署:
jar cvf myapp.war webproject-directory
该命令将创建myapp.war部署文件。
需要注意的是该文件对于tomcat来说也是一个文件夹。只要访问url到了/myapp,tomcat就会首先将myapp.war解压,并且根据该war中的web.xml配置来寻址url对应的class并且执行后返回结果
maven
maven是一个apache基金会开源的java构建,依赖管理的工具,类似C语言下的make,本身也是java写的
maven的特点:
1. 约定优先,maven非常强烈地建议相应最佳实践下的目录结构
2. 内置提供了第三方依赖管理,支持自建自管仓库,项目的依赖直接从这个仓库中下载
3. 提供了一致的构建过程
4. 插件式架构,大量的可用插件完成我们的构建流程
5. 方便和IDE集成
maven安装使用过程:
1. 下载http://mirror.bit.edu.cn/apache/maven/maven-3/3.6.0/binaries/apache-maven-3.6.0-bin.zip
2. 解压,并且将对应bin目录放到path环境变量中,配置环境变量M2_HOME=/path/to/maven
3. mvn -v确保正常输出
由于国内访问maven仓库非常慢,阿里云公益心做了对应的镜像。
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
maven的pom.xml(project object model)文件
项目坐标:
groupId,组织,比如com.example
artifactId,项目标识符,比如mymodule,myproject等;
version, 版本,比如1.0.1-SNAPSHOT,这里snapshot在maven构建时将被替换为timestamp
dependencies
这里描述本项目的依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>provided</scope>
</dependency>
</dependencies>
classpath
classpath用于连接java run time library和文件系统。它定义编译器和解释器应该在何处去查找要加载的.class文件。其基本思想是:文件系统的层次结构就反映了java包的层次结构,而classpath则定义了文件系统中的哪些目录可以作为java包层次结构的根(root)
https://www.ibm.com/developerworks/cn/java/j-classpath-windows/
请求转发forward和重定向redirect
请求转发是由servlet将当前的request和response交给另外的组件处理,最终由其他组件负责返回浏览器响应。对于浏览器来说,这是一次请求,一次响应。请求的转发发生在服务端内部。浏览器地址栏并不会改变;
RequestDispatcher(forward或者include(include是所有组件都可以输出信息))的获取
通过HttpServletRequest获取,通过ServletContext获取
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
RequestDispatcher rd = req.getRequestDispatcher("/forwardExample");
rd = this.getServletContext().getNamedDispatcher(
"ServletForwardExample");
rd = this.getServletContext().getRequestDispatcher("/forwardExample");
rd.forward(req, resp);
}
sendRedirect
通过response对象发送给浏览器一个新的url地址,往往就是http location,浏览器自动跳转
监听器
监听器分类
按照监听器所监听的对象可以分为:
监听应用程序环境(ServletContext),又可以细致分为ServletContextListener(创建和销毁),ServletContextAttributeListener(对象属性的CRUD),
监听用户请求对象(ServletRequest),也可以细致分为:ServletRequestListener(创建和销毁),ServletRequestAttributeListener(对象属性的CRUD)
监听用户会话对象(HttpSession),也可以细致分为HttpSessionListener(创建和销毁),HttpSessionAttributeListener(对象属性的CRUD),HttpSessionActivationListener监听session持久化到磁盘,或者从磁盘恢复到内存的事件。
HttpSessionBindingListener: attribute方法调用或者removeAttribute方法调用时会触发
监听器,过滤器,Servlet的启动顺序
监听器,过滤器或者Servlet的启动顺序首先取决于在部署描述符web.xml中定义的顺序,按照其定义顺序而顺序创建的。
监听器优先级,高于过滤器,高于Servlet
servlet并发
servlet并发线程模型:

多个请求访问同一个servlet时,由于被容器分别以多个worker线程来调用单实例servlet对应的service方法,因此在servlet的开发中,我们必须注意线程安全问题!!
servlet并发处理的特点:
1. 单实例,我们知道servlet的生命周期中只初始化创建一次,也就是单实例
2. 多线程,当多个用户同时访问同一个servlet时,对应的servlet的service方法或者get,post方法将在不同的worker thread中同时执行,也就是具有多线程运行模式;
3.线程不安全,也正是因为1,2两个特点导致了servlet是线程不安全的。
如何做到servlet线程安全?
变量的线程安全:
1. 参数变量本地化,由于local变量并不暴露在不同的线程中,因此是线程安全的;
2. 对于需要同步访问的线程不安全变量写访问时,必须加上synchronized锁
属性的线程安全:
1. ServletContext的属性是线程不安全的
2. HttpSession理论上是线程安全的,但是如果同一个用户在浏览器同一个进程中打开多个tab也可能不安全;
3.ServletRequest是线程安全的,因为它是在每一次request时创建并供使用的数据
以下两点需要注意:
1. 避免在Servlet中再创建新的线程,这将会导致程序异常复杂,容易出错;
2. 多个Servlet需要访问同一个外部对象时,必须加锁处理
public class ConcurrentServlet extends HttpServlet {
String name; // 尽量避免使用这类实例变量,因为这是线程不安全的,如果必须使用则必须加锁
/**
*
*/
private static final long serialVersionUID = -6948878379930865229L;
@Override
public void init() throws ServletException {
super.init();
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
synchronized (this) {
name = req.getParameter("username");
PrintWriter out = resp.getWriter();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
out.println("username: " + name);
}
}
@Override
public void destroy() {
super.destroy();
}
}
java web dev知识积累的更多相关文章
- Java web 入门知识 及HTTP协议详解
Java web 入门知识 及HTTP协议详解 WEB入门 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资 ...
- Java Web架构知识整理——记一次阿里面试经历
惭愧,从一次电面说起.我个人在某国企做一名软件设计师,国企大家都懂的,待遇一般而且没啥意思,做的方向基本都是操作系统.驱动和工具软件的开发,语言基本都是C/C++.最近也想跳槽,刚好有幸得到了一次阿里 ...
- Java Web dev搭建经验总结
摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! 回馈分析法使我看到,我对专业技术人员,不管是工程师.会计师还是市场研究人员,都容易从直觉上去理解 ...
- java web基础知识
1)TCP三次握手 第一次握手:客户端A将标志位SYN置为1,随机产生一个值为seq=J(J的取值范围为=1234567)的数据包到服务器,客户端A进入SYN_SENT状态,等待服务端B确认: 第二次 ...
- 《Java web 开发实战经典》读书笔记
去年年末,也就是大四上学期快要结束的时候,当时保研的事情确定了下来,终于有了一些空闲的时间可以学点实用的技术. 之前做数据库课程设计的时候,也接触过java web的知识,当时做了一个卖二手书籍的网站 ...
- 自我总结(四) ---java web项目完结,j2ee的开始
自我完善的过程就是在不断的自我总结不断的改进. 前半个月刚好把项目做完了,项目也答辩了.总的来说吧,我觉得自己在java web这块知识上不算是彻彻底底把他弄懂了,就是说到的知识点都能够回答的上来一些 ...
- 学了近一个月的java web 感想
对于每天学习的新知识进行一定的总结,是有必要的. 之前我学的每一门知识,我都没有怎么总结自己的问题,也没有怎么去想想该怎样才能学的更好,把知识掌握的更牢固.从现在开始呢,我会每半个月,或每一个月总结总 ...
- java web开发必备知识
从各种招聘网站的要求上筛选出了一些java开发的一些基本的要求,对照自身看看有哪些缺陷. java基础 既然是java web开发,java SE肯定要学好了. 多线程,IO,集合等,对队列,缓存,消 ...
- JAVA WEB快速入门之从编写一个基于SpringBoot+Mybatis快速创建的REST API项目了解SpringBoot、SpringMVC REST API、Mybatis等相关知识
JAVA WEB快速入门系列之前的相关文章如下:(文章全部本人[梦在旅途原创],文中内容可能部份图片.代码参照网上资源) 第一篇:JAVA WEB快速入门之环境搭建 第二篇:JAVA WEB快速入门之 ...
随机推荐
- php插入数据含有特殊符号的处理方法
我们在向mysql写入数据时,比如: mysql_query(”update table set `title`=’kuhanzhu’s blog’”); http://www.cnblogs.com ...
- Vue笔记:封装 axios 为插件使用
前言 自从Vue2.0推荐大家使用 axios 开始,axios 被越来越多的人所了解.使用axios发起一个请求对大家来说是比较简单的事情,但是axios没有进行封装复用,项目越来越大,引起的代码冗 ...
- Percona XtraDB Cluster
简介 Percona XtraDB Cluster是MySQL高可用性和可扩展性的解决方案,Percona XtraDB Cluster提供的特性如下: 1.同步复制,事务要么在所有节点提交或不提交. ...
- 了解MySQL联表查询中的驱动表,优化查询,以小表驱动大表
一.为什么要用小表驱动大表 1.驱动表的定义 当进行多表连接查询时, [驱动表] 的定义为: 1)指定了联接条件时,满足查询条件的记录行数少的表为[驱动表] 2)未指定联接条件时,行数少的表为[驱动表 ...
- OpenGL学习笔记:Console工程下如何不显示控制台黑窗口只显示Windows窗口
刚学习OpenGL,绘制图形的时候,如果不进行设置,运行的时候会先出现黑窗口再出现Windows窗口. 其实要去除控制台窗口非常简单,只需要修改工程设置,把子系统改成Windows,程序的入口点改成m ...
- WPF备忘录(4)打个勾画个叉娱乐下
<Path Grid.Column="2" Data="M43,5 L20,40 20,40 0,20 6,15 18,26 37,7 43,5 z" F ...
- rsync --include-from --exclude-from的理解
rsync --include-from --exclude-from的理解: 1.同时添加--include-from --exclude-from时.后者是对前者的结果进行排除 如:“--incl ...
- NPOI导出Excel及使用问题
NPOI导出Excel及使用问题 因为最近公司质管部门提出了一个统计报表的需求:要求导出一个2016及2017年度深圳区域的所有供应商的费用成本计算--一个22列的Excel表,其中还包括多列的合并单 ...
- 撩课-Web大前端每天5道面试题-Day27
1.浏览器缓存? 浏览器缓存分为强缓存和协商缓存.当客户端请求某个资源时,获取缓存的流程如下: 先根据这个资源的一些 http header 判断它是否命中强缓存, 如果命中,则直接从本地获取缓存资源 ...
- postgreSQL数据库的监控及数据维护
目前postgreSQL数据库的管理,数据查询等都需要安装postgreSQL软件或安装pgadmin等,远程访问都需要先登录到服务器等繁琐的操作.如果是开发团队,那么每个开发,测试,管理人员都要经历 ...