Tomcat 服务器是⽬前最为流⾏的Tomcat服务器是Apache-Jarkarta开源项⽬中的⼀个⼦项⽬,是⼀个⼩型、轻量级的⽀持JSP和Servlet 技术的Web服务器,也是初学者学习开发JSP应⽤的⾸选。Tomcat是开源的⼩型web服务器 ,完全免费,主要⽤于中⼩型web项⽬,只⽀持Servlet和JSP 等少量javaee规范 (JavaWeb编程接⼝)。
Tomcat下载地址
选择相应的版本,这里选择Tomcat 9。
下载完成后解压到一个无特殊符号路径(一般纯英文路径即可)
进入bin目录下,双击startup.bat启动。
提前配置JAVA_HOME环境变量。(可参见相关教程中的JAVA_HOME配置)
新建系统环境变量:CATALINA_HOME
相同的方法,再新建系统环境变量:CATALINA_BASE
打开Path,添加:
%CATALINA_HOME%\lib
%CATALINA_HOME%\bin
验证是否配置成功:
打开cmd,输入startup,出现如下结果(注:此处顺便验证java环境是否正确),与之前直接双击startup.bat效果一致:
测试Tomcat:打开浏览器,地址栏输入:http://localhost:8080/,效果如下:
注意到上面Tomcat命令行启动出现了中文乱码了吗?解决方案如下:
打开conf文件夹下的logging.properties文件
将如下行中 UTF-8更改为GBK
然后再启动,就没有乱码啦!
该⽬录下存放的是⼆进制可执⾏⽂件,用来存储一些指令信息。
如果是安装版,那么这个⽬录下会有两个exe⽂件: tomcat9.exe、tomcat9w.exe,前者是在控制台下启动Tomcat,后者是弹出UGI窗⼝启动Tomcat;如果是解压版,那么会有startup.bat和shutdown.bat⽂件,startup.bat⽤来启动Tomcat,但需要JDK的 配置,shutdown.bat⽤来停⽌Tomcat 。
这是⼀个⾮常⾮常重要的⽬录,用来存储配置文件信息。
这个⽬录下有四个最为重要的⽂件:
server.xml:配置整个服务器信息。例如修改端⼝号,添加虚拟主机等;
tomcat-users.xml:存储tomcat⽤户的⽂件,这⾥保存的是tomcat的⽤户名及密码,以及⽤户的⻆⾊信息。可以按着该⽂件中的注释信息添加tomcat⽤户,然后就可以在Tomcat主⻚中进⼊Tomcat Manager ⻚⾯了;
web.xml:部署描述符⽂件,这个⽂件中注册了很多MIME类型,即⽂档类型。这些MIME类型是客户端与服务器之间说明⽂档类型的,如⽤户请求⼀个html⽹⻚,那么服务器还会告诉客户端浏览器响应的⽂档是text/html类型的,这就是⼀个MIME类型。客户端浏览器通过这个MIME类型就知道如何处理它了。 当然是在浏览器中显示这个html⽂件了。但如果服务器响应的是⼀个exe⽂件,那么浏览器就不可能显示它,⽽是应该弹出下载窗⼝才对。MIME就是⽤来说明⽂档的内容是什么类型的!
context.xml:对所有应⽤的统⼀配置,通常我们不会去配置它。
Tomcat的类库,用来存放jar⽂件。如果需要添加Tomcat依赖的jar⽂件,可以把它放到这 个⽬录中,当然也可以把应⽤依赖的jar⽂件放到这个⽬录中,这个⽬录中的jar所有项⽬都可以共享, 但这样你的应⽤放到其他Tomcat下时就不能再共享这个⽬录下的jar包了,所以建议只把Tomcat需要的jar包放到这个⽬录下。
这个⽬录中都是⽇志⽂件,记录了Tomcat启动和关闭的信息。如果启动Tomcat时有错误,那 么异常也会记录在⽇志⽂件中。
存放Tomcat的临时⽂件,这个⽬录下的东⻄可以在停⽌Tomcat后删除!
存放web项⽬的⽬录,其中每个⽂件夹都是⼀个项⽬。如果这个⽬录下已经存在了⽬录,那么都是tomcat⾃带的项⽬。其中ROOT是⼀个特殊的项⽬,在地址栏中没有给出项⽬⽬录时,对应的就是ROOT项⽬。
http://localhost:8080/examples,进⼊示例项⽬。其中examples就是项⽬名,即⽂件夹的名字。
运⾏时⽣成的⽂件,最终运⾏的⽂件都在这⾥,存放编译之后的文件。通过webapps中的项⽬⽣成的!可以把这个⽬录下的内容删除,再次运⾏时会⽣再次⽣成work⽬录。当客户端⽤户访问⼀个JSP⽂件时,Tomcat会通过JSP⽣成Java⽂件,然后再编译Java⽂件⽣成class⽂件,⽣成的java和class⽂件都会存放到这个⽬录下。
许可证。
说明⽂件。
通过url访问服务器: url:http://服务器的ip地址:端⼝号/项⽬名/被访问的⻚⾯
示例:http://localhost:8080/test01
注:
(1)启动tomcat后,tomcat会加载部署在服务器端的所有项⽬
(2) 浏览器访问的⻚⾯是服务器端的⻚⾯,基本上服务器的项⽬和⼯作空间的项⽬要保持⼀致
(1)点击run–EDit Configurations
(2)点击左侧“+”号,找到Tomcat Server—Local(若是没有找到Tomcat Server 可以点击最后⼀⾏ 34 items more)
(3)在Tomcat Server -> local-> Server -> Application server项⽬下,点击 Configuration ,找到本地 Tomcat 服务器,再点击 OK按钮。
至此就配置好了。
修改配置⽂件:/conf/server.xml
如果将端⼝号改成80,则访问项⽬时的请求路径就可以省略端⼝号。
给tomcat增加管理员信息:
配置 conf/tomcat-users.xml
点击左上⻆的File–>New–>Project
找到Java Enterprise之后,在Application Sever中找到⾃⼰的Tomcat,同时勾选中Web Application。
由于我的idea版本比较新,所以创建之后,会自动配置很多东西,当然,它默认使用了maven管理项目结构,所以创建完成之后是这样的:
Tomcat环境配置:
点击运行按钮,启动Tomcat服务器:
会自动跳出一个页面:
在3.1中的处理请求中,请求的处理可以使用serverlet。
serverlet中的三步走:
- 接参数
- 写逻辑(涉及到操作数据库)
- 返结果
(1) Servlet接⼝定义了Servlet与servlet容器之间的契约。这个契约是:Servlet容器将Servlet类载⼊内存,并产⽣Servlet实例和调⽤它具体的⽅法。但是要注意的是,在⼀个应⽤程序中,每种Servlet类型只能有⼀个实例。
(2)⽤户请求致使Servlet容器调⽤Servlet的Service()⽅法,并传⼊⼀个ServletRequest对象和⼀个 ServletResponse对象。ServletRequest对象和ServletResponse对象都是由Servlet容器(例如 TomCat)封装好的,并不需要程序员去实现,程序员可以直接使⽤这两个对象。
(3)ServletRequest中封装了当前的Http请求,因此,开发⼈员不必解析和操作原始的Http数据。ServletResponse表示当前⽤户的Http响应,程序员只需直接操作ServletResponse对象就能把响应轻松的发回给⽤户。
(4)对于每⼀个应⽤程序,Servlet容器还会创建⼀个ServletContext对象。这个对象中封装了上下⽂ (应⽤程序)的环境详情。每个应⽤程序只有⼀个ServletContext。每个Servlet对象也都有⼀个封装Servlet配置的ServletConfig对象。
当客户端⾸次发送第⼀次请求后,由容器(web服务器(tomcat))去解析请求, 根据请求找到对应的servlet, 判断该类的对象是否存在,不存在则创建servlet实例,调取init()⽅法 进⾏初始化操作,初始化完成后调取 service()⽅法,由service()判断客户端的请求⽅式,如果是get,则执⾏doGet(),如果是post则执⾏ doPost().处理⽅法完成后,作出相应结果给客户端.单次请求处理完毕。当⽤户发送第⼆次以后的请求时,会判断对象是否存在,但是不再执⾏init(),⽽直接执⾏service⽅法,调取 doGet()/doPost()⽅法。
总结一下,整个生命周期有四个过程:
(1)实例化 --先创建servlet实例
(2)初始化 --init()
(3)处理请求 —service()
(4)服务终⽌ --destory()
图解如下:
HttpServletRequest表示Http环境中的Servlet请求,它扩展于javax.servlet.ServletRequest接⼝。
常⽤⽅法:
1)String getParameter(String name) 根据表单组件名称获取提交数据,返回值是String
注:服务器在接收数据时使⽤字符串统⼀接收
2)String[ ] getParameterValues(String name) 获取表单组件对应多个值时的请求数据
3)void setCharacterEncoding(String charset) 指定每个请求的编码(针对post请求才起作⽤)
4)RequestDispatcher getRequestDispatcher(String path) --跳转⻚⾯
5)存值 request.setAttribute(“key”,value);6)取值 request.getAttribute(“key”);//取值后需要向下转型
相关补充知识点:
补充1:客户端将数据发送给服务器的方式
方式1:通过表单通过 get/post 方式提交
方式2:通过a标签发送数据(本质上是get提交)
<a href="/login?name=abc&pass=123">
方式3:通过地址栏直接拼接(get请求)
方式4:js提交数据(get请求)
location.href=/login?name=abc&pass=123
补充2:处理请求乱码
方式1:
setCharacterEncoding(“UTF-8”); //post提交时有效
方式2:
String s = new String(变量名.getBytes(“ISO-8859-1”), “UTF-8”); // get提交乱码
方式3:
修改tomcat配置文件(get提交)
修改目录结构\conf\server.xml:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />
但是在tomcat8.0以后不再需要手动设置此属性
补充3:get和post的区别
\1. GET请求:get请求方法的含义是从服务器获取资源,资源类型可以是文本、图片、视频等资源。请求的数据会附加在URL之后,以?分割URL和传输数据,多个参数⽤&连接。URL的编码格式采⽤的是ASCII编码,⽽不是Unicode,即所有的⾮ASCII字符都要编码之后再进行传输。
POST请求:post请求相反,向URL指定的资源提交数据,并请求的数据放置在HTTP请求包的body中。
\2. 在HTTP规范中,没有对URL的⻓度和传输的数据⼤⼩进⾏限制。但是在实际开发过程中,对于GET,特定的浏览器和服务器对URL的⻓度有限制。因此,在使⽤GET请求时,传输数据会受到URL⻓度的限制。 对于POST,由于不是URL传值,理论上是不会受限制的,但是实际上各个服务器会规定对POST提交数据⼤⼩进⾏限制,Apache、IIS都有各⾃的配置。
\3. 安全性和幂等性
在HTTP协议中,安全的概念是是指请求方法不会“破坏”服务器上的资源,幂等是指多次执行相同的操作,结果都是相同的。显然GET方法是安全且幂等的,因为是只读操作;POST是新增数据,所以是不安全的和不幂等的。
但是在另一种安全的意义上,POST的安全性比GET高。这里的安全是指真正的安全,不同于上面的安全,上面的安全仅仅是不修改服务器的数据。比如在进行登录操作时,通过get请求,用户名和密码都会暴露在URL上,且登录页面很可能被浏览器缓存导致账号密码的泄露,然后你的钱就没了;相反,POST请求由于将数据封装在body中,就会安全很多。
在Service API中,定义了⼀个HttpServletResponse接⼝,它继承⾃ServletResponse接⼝,专⻔⽤来封装HTTP响应消息。 在HttpServletResponse接⼝中定义了向客户端发送响应状态码,响应消息头,响应消息体的⽅法。
常⽤⽅法:
void addCookie(Cookie var1);//给这个响应添加⼀个cookie
void sendRedirect(String var1) ;//发送⼀条响应码,将浏览器跳转到指定的位置
PrintWriter getWriter(); 获得字符流,通过字符流的write(String s)⽅法可以将字符串设置到response缓冲区中,随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览器端。
setContentType(); 设置响应内容的类型
重定向和转发的异同点:
重定向:response.sendRedirect()
转发:request.getRequestDispatcher("…/success.jsp").forward(request,response);
相同点:都⽤来跳转⻚⾯
不同点:
a.重定向时地址栏会改变,request中存储的数据会丢失。转发时地址栏显示的是请求⻚⾯的地址,request数据可以保存。
b.转发属于⼀次请求⼀次响应,重定向属于两次请求(地址栏修改了两次)两次响应。
会话的概念:从打开浏览器到关闭浏览器,期间访问服务器就称为⼀次会话。
request存的值只能在单次请求中保存,保存的数据不能跨⻚⾯,当重定向时,request存的值会丢失。
session的数据可以在多个⻚⾯中共享,即使重定向⻚⾯,数据也不会丢失,且session中可以包含n个request。
常用方法:
void setAttribute(String key, Object value) 以key/value的形式保存对象值,将数据存储在服务器端
Object getAttribute(String key) 通过key获取对象值
void invalidate() 设置session对象失效
String getId() 获取sessionid,当第⼀次登录成功后,session会产⽣⼀个唯⼀的id,浏览器之后访问时如果发现id值还是之前id,那么说明当前访问的属于同⼀个会话
void setMaxInactiveInterval(int interval) 设定session的⾮活动时间
int getMaxInactiveInterval() 获取session的有效⾮活动时间(以秒为单位),默认的有效时间:30 分钟
void removeAttribute(String key) 从session中删除指定名称(key)所对应的对象
综上所述,我们可以利用invalidate()、removeAttribute(String key)的方法使session失效,当然了,直接关闭浏览器也会让session失效。
此部分内容,请参见我的另一篇文章,有非常详细的解释及相关代码:javaWeb-jsp
此部分内容,请参见我的另一篇文章:基于过滤器实现登录验证和评论的敏感词过滤等功能
Web MVC中的M(模型)-V(视图)-C(控制器)概念和标准MVC概念⼀样。
Web MVC标准架构:
M(Model) 模型 : 应⽤程序的核⼼功能,管理这个模块中⽤的数据和值(bean,dao);
V(View )视图:视图提供模型的展示,管理模型如何显示给⽤户,它是应⽤程序的外观(jsp/html);
C(Controller)控制器: 对⽤户的输⼊做出反应,管理⽤户和视图的交互,是连接模型和视图的枢纽(servlet/service)。
通常意义上的三层架构就是将整个业务应⽤划分为:表现层(UI)、业务逻辑层(BLL)、数 据访问层(DAL)。
区分层次的⽬的:“⾼内聚,低耦合”。
1、表现层(UI):通俗讲就是展现给⽤户的界⾯,即⽤户在使⽤⼀个系统的时候他的所⻅所得。 (jsp/html )表现层的代表作品:SpringMVC。
2、业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。 (servlet,service )业务层的代表作品:Spring。
3、数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找 等。(dao)数据访问层的代表作品:mybatis。
MVC可以是三层中的⼀个表现层框架,属于表现层。
三层和mvc可以共存。
三层是基于业务逻辑来分的,⽽MVC是基于页⾯来分的。
MVC主要⽤于表现层,3层主要⽤于体系架构,3层⼀般是表现层、中间层、数据层,其中表现层⼜可以 分成M、V、C,(Model View Controller)模型-视图-控制器
MVC是表现模式(Presentation Pattern) ,三层架构是典型的架构模式(Architecture Pattern)。
三层架构的分层模式是典型的上下关系,上层依赖于下层。但MVC作为表现模式是不存在上下关系的, ⽽是相互协作关系。即使将MVC当作架构模式,也不是分层模式。
总的来说MVC和三层架构基本没有可⽐性,是应⽤于不同领域的技术。
AJAX全称Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。 AJAX 不是新的编程语⾔,⽽是⼀种使⽤现有标准的新⽅法。 AJAX 是与服务器交换数据并更新部分网页的技术,不需要重新加载整个页面。
Ajax使用CSS和HTML来表示,用DOM模型来交互和动态显示,使用XML HttpRequest来和服务器进行异步通信(不同的浏览器稍有差异,IE使用ActiveXObject创建XML HttpRequest,而其他浏览器使用XML HttpRequest的JavaScript内建对象来创建),使用JavaScript来绑定和调用。
Ajax的⼯作原理相当于在⽤户和服务器之间加了—个中间层(AJAX引擎),使⽤户操作与服务器响应异步化。并不是所有的⽤户请求都提交给服务器。像—些数据验证和数据处理等都交给Ajax引擎⾃⼰来做,, 只有确定需要从服务器读取新数据时再由Ajax引擎代为向服务器提交请求。
此处不介绍传统的Ajax操作,因为其步骤较为繁琐,各种方法属性也较多不好记忆,如有需要请自行百度,
可以通过发送 HTTP请求加载远程数据,是 jQuery 最底层的 Ajax 实现,具有较⾼灵活性。
实现格式:
$.ajax({ url:请求地址 type:"get | post | put | delete " 默认是get, data:请求参数 {"id":"123","pwd":"123456"}, dataType:请求数据类型"html | text | json | xml | script | jsonp ", success:function(data,dataTextStatus,jqxhr){ },//请求成功时 error:function(jqxhr,textStatus,error)//请求失败时 })
$.get(url, data, function(result) { url:请求的路径 data:发送的数据 result:返回的数据 });
$.post(url, data, function(result) { url:请求的路径 data:发送的数据 result:返回的数据 });
JSON (JavaScript Object Notation) 是⼀种轻量级的数据交换格式, 易于⼈阅读和编写,同时也易于机器解析和⽣成。
var 变量名 = { “key” : value , // Number类型 “key2” : “value” , // 字符串类型 “key3” : [] , // 数组类型 “key4” : {}, // json 对象类型 “key5” : [{},{}] // json 数组 };
json对象是⼀个对象,⾥⾯的key就是对象的属性,我们要访问⼀个对象的属性, 只需要使⽤【对象名.属性名】的⽅式访问即可。
有关JSON的一些使用可以查看我的这一篇博客:Json解析中FastJson与Gson的简单使用