JavaEE介绍
web概述
资源分类
系统结构
CS结构:Client-Server,客户端-服务端,需要用户安装客户端,资源、网络占用小,但是维护成本大。
BS结构:Browser-Server,浏览器-服务端,不需要安装客户端,只需要浏览器,维护成本小。
JavaWeb服务器介绍
重量级服务器:实现了全部的JavaEE规范;轻量级服务器:实现了一部分JavaEE规范,安装使用比较简单。
Tomcat基本使用
如在webapps下有hello/index.html就输入localhost:8080/hello/index.html。
Tomcat启动后cmd乱码
启动Tomcat后如果命令行输出的日志是乱码,是字符集的问题,Tomcat字符集是UTF-8,cmd的字符集是GBK。
要么把系统的字符集改了:
控制面板——区域——管理——更改系统区域设置——勾选Beta版:
要么把Tomcat日志的字符集改成GBK:
Tomcat安装目录——conf——logging.properties——把字符集改成GBK:
Tomcat安装版有个端口是-1,改成8005。
IDEA集成Tomcat
点Configure——选择Tomcat安装目录——OK(注意:路径不能有“-”,apache-tomcat不行)
创建JavaEE项目
File——New——Project或Module——选择JavaEnterprise(Java企业)——选择JDK版本、Web application和Tomcat
用IDEA发布项目
On 'Update' action手动点击更新按钮:更新class文件和静态文件,On frame deactivation:IDEA失去焦点时:啥都不做。
当修改代码后,点击更新按钮,在浏览器刷新,就能看到效果。
更新按钮:
war包的形式发布,XXX:war exploded是自己的项目,下面Application context是访问路径,为空是/,只能配置一个/。
配置项目访问路径为/,则输入ip和端口号就能访问到WebDemo项目的webapp目录,还要继续指定访问该项目下的哪个文件,如果不指定,默认访问index.jsp。
手动发布项目
进入项目的webapp目录:
cmd进入,打war包:
生成war包:
拷贝到Tomcat/webapps/下:
启动Tomcat:(先把IDEA的Tomcat服务关掉)
访问ip:端口/项目名/文件
启动后自动解包,生成项目的文件夹。
Tomcat配置文件
主配置文件server.xml
http协议的端口是80,当访问一个网址,输入http:则默认使用80端口不需要手动写。
我们开发时使用8080端口,上线后使用80端口。
Tomcat虚拟目录
配置之前只能把my项目目录放在webapps下,访问ip:port/my/xxx,配置后可以不把my项目目录放在webapps下也能访问。
Tomcat虚拟主机
hosts文件:
当访问name:port/path时,找appBase/docBase项目
HTTP协议
HTTP介绍:
HTTP请求:
总结:
HTTP响应:
总结:
Servlet
修改默认主页
把前端项目目录全部拷到JavaEE项目的webapp目录下。
设置默认主页:(不修改默认访问webapp/index.jsp)
<!--修改默认主页-->
<welcome-file-list>
<welcome-file>/addStudent.html</welcome-file>
</welcome-file-list>
文件名是相对路径,相对于webapp目录。
Servlet介绍:
Servlet实现方式:
实现Servlet接口的方式发布动态资源:
创建JavaEE项目,把静态资源拷到webapp目录下,
src/java/包/下创建StudentServlet实现Servlet接口,重写service方法。
webapp/WEB-INF/web.xml中配置Servlet的声明和映射:
<!--Servlet声明-->
<servlet>
<servlet-name>studentServlet</servlet-name>
<servlet-class>com.itheima.servlet.StudentServlet</servlet-class>
</servlet>
<!--Servlet映射-->
<servlet-mapping>
<servlet-name>studentServlet</servlet-name>
<url-pattern>/studentServlet</url-pattern>
</servlet-mapping>
启动Tomcat服务后,可以访问项目路径/studentServlet,(项目路径 + <url-pattern>里的url)。
当请求到<url-pattern>里的url时,会根据<servlet-name>里的名称找到<servlet-class>里的类名,调用service方法。
Servlet执行流程:
Servlet关系视图:
继承HttpServlet的方式
为什么要重写doGet和doPost方法:
HttpServlet重写了父类的service()方法,参数是ServletRequest,ServletResponse,在这个方法里把参数转换成HttpServletRequest,HttpServletResponse,传给重载的service方法,重载方法里判断,请求方式是get就调用doGet,请求方式是post就调用doPost,其他请求方式也调用对应的方法。
Servlet生命周期
对象的生命周期:对象创建到销毁的过程。
创建:init()方法;服务:service()方法;销毁:destroy()方法。
Servlet对象只有一个,来一个请求就会调用他的doGet或doPost等方法。
Servlet线程安全问题
一个客户端浏览器就是一个线程,而Servlet对象只有一个,成员变量也只有一份,因此多个用户访问同一个成员变量就会涉及到线程安全问题。
定义一个成员变量username,get请求根据url里的用户名给成员变量赋值,睡(把执行权交给另一个线程),睡醒后返回用户名:
果然会出现线程安全问题,用户aaa访问,username= aaa,交出执行权,用户bbb访问,username = bbb,交出执行权,向aaa响应username=bbb,向bbb响应username=bbb。
解决方式:
①把变量定义成局部变量,放在doGet方法内,这样每来一个请求就会创建一个变量,不会有线程安全问题:
②同步,锁对象可以用当前Servlet对象(唯一)
Servlet的三种映射方式
/开头+通配符:/servlet/*表示只要路径以servlet/开头就会访问这个Servlet:
通配符+固定格式:*.do表示只要路径以.do结尾就会访问这个Servlet:
Servlet多路径访问:
就是利用上述通配符方式实现多种路径都能映射到这个Servlet对象,再通过不同的路径做不同处理。
Servlet创建时机
默认的Servlet
Tomcat显示错误信息的页面也是经过一个Servlet处理返回的,因为Tomcat也是Java写的,所以都是Servlet。
ServletConfig
ServletConfig的配置方式:
在web.xml—<web-app>—<servlet>中配置
ServletConfig的常用方法:
ServletConfig的使用方式:
域对象
ServletContext
ServletContext的配置方式:
在web.xml—<web-app>中配置
ServletContex常用方法:
获取ServletContext对象用的方法继承自HttpServlet的父类GenericServlet。
获取到的绝对路径是out目录下的,是项目编译的结果:
getRealPath方法通常用来获取资源文件的绝对路径,如a、b、c三个资源文件的位置如图:
用虚拟路径访问绝对路径如下:
src目录中的内容编译之后位于/WEB-INF/class/目录下,编译之后没有arc目录。
Servlet之间共享数据:
在一个Servlet中的添加数据:
在另一个Servlet中获取数据:
Servlet注解开发
Servlet3.0版本:
注解参数是路径:
注解的本质是接口。