黑马程序员技术交流社区
标题:
天不生我Tomcat,sevlet万古如长夜
[打印本页]
作者:
退换货的通话
时间:
2019-8-5 16:30
标题:
天不生我Tomcat,sevlet万古如长夜
软件的架构
c/s --->客户端服务器
b/s --->浏览器服务器
web是基于网络编程, 底层用tcpip协议
1.Tomcat
访问: http://ip地址:8080/ROOT/index.jsp
启动报错:
1.JAVA_HOME没有配置好
2.端口被占用
杀死占用你端口的进程
netstat -ano --->查到所有进程
修改我们自身端口:
修改conf/server.xml ---->改很多个地方
2.如何部署项目(放置)
1.将项目直接拷贝到tomcat中的webapps目录下, 而且建议以打包war的方式拷贝
2.在server,xml中<Host>标签下,添加一个 <Context docBase="真实路径" path="虚拟路径" />
不会用的:原因有可能损坏核心配置文件
3.在conf/catalina/localhost/ 下创建任意名字的xml文件
文件定义如下内容: <Context docBase="真实路径" /> , 将来用户访问,文件名就是"虚拟路径";
3.Servlet
是一种动态资源,(可以编写逻辑判断!!!!!), Servlet其实就是接口,里面规定你要写动态资源,只有能Servlet提供的这些方法,Tomcat才能认识
作用: 编写Servlet其实运行服务端的小程序, 专门处理逻辑性的东西,用来处理用户的请求,并作出相应
使用步骤:
1.定义一个类,实现Servlet接口
2.重写所有的抽象方法
3.在service方法中书写逻辑
4.在web.xml配置一下
<servlet>
<servlet-name>aaa</servlet-name>
<servlet-class>cn.itcast.web.servlet.DemoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>aaa</servlet-name>
<url-pattern>/mei</url-pattern>
</servlet-mapping>
4.Servlet的生命周期的方法
init() ---->只会执行一次,默认是第一个用户访问时会创建该Servlet,并且调用init();
我们可以改变Serlvet创建时机, <load-on-startup>正数</load-on-startup> ,就可以在服务器启动的时候创建Servlet
什么时候用到:当我们在init方法加载数据量比较大的东西时,建议配置 <load-on-startup>正数</load-on-startup>,
为了提供第一个用户的体验!!!!!
service() ---->每一次用户访问都会执行
destroy() ----> 只会执行一次, 当服务器"正常关闭"的时候,执行.
注意: Servlet是单例的(一个类在内存只有一个对象, 这样成员变量只有一套, 出现线程安全问题), 尽量不要定义成员变量,定义局部变量
5.Servlet3.0支持注解开发
使用步骤:
1.定义一个类,实现Servlet接口
2.重写所有的抽象方法
3.在service方法中书写逻辑
4.在编写好的servlet类身上加@WebServlet的注解.
@WebServlet注解
里面有一个属性很重要"urlPatterns"和"value"是一样的
执行原理:
假设用户输入:http://localhost:8080/DemoSerlvet1,
http://localhost可以找到服务器电脑
http://localhost:8080可以找到Tomcat
/DemoSerlvet1: 这个tomcat会去查classes目录下的所有的字节码上有没有一个@WebSerlvet的注解,
且value的值或者"urlPatterns"的值是否"/DemoSerlvet1",如果是, 就会创建该类的对象, 调用其service方法
6.Serlvet的注意事项
1.WEB-INF下的不能被浏览器直接访问
2.真正发布的项目在out下面
7.Servlet的继承体系
Servlet ----> GenericServlet ---->HttpServlet
GenericServlet:
优点:不用重写一些不太重要的方法, 可以让代码看起来更简洁
缺点:没有和http协议绑定, 不能获取http协议中特殊的内容
HttpServlet:
优点: 和Http协议绑定比较紧密, 可以获取Http协议中特殊的内容
缺点: service方法做了方法的分发, 因为现在get和post方式获取参数的方式统一了,所以doGet和doPost的逻辑都一样了!!!
8.Servlet的urlPatterns的配置
1.rlPatterns 可以定义多个值的
2.路径配置规则
绝对路匹配: 例如: "/demo1" 只有用户访问"/demo1"的时候才能找到这个资源
目录匹配:
例如:"/user/login" ----> 只有用户访问"/user/login"的时候才能找到这个资源
例如:"/user/*" ---->只要用以"/user/"开头的都可能找到这个资源
例如:"/*" --->所以路径都能找到这个资源
后缀名匹配:
例如: "*.aaa" ---->可以匹配以.aaa后缀名结尾的,但是不能以"/"开头!!!!
8. login.html中form表单的action路径的写法
* 虚拟目录+Servlet的资源路径
9. BeanUtils工具类,简化数据封装
* 用于封装JavaBean的
1. JavaBean:标准的Java类
1. 要求:
1. 类必须被public修饰
2. 必须提供空参的构造器
3. 成员变量必须使用private修饰
4. 提供公共setter和getter方法
2. 功能:封装数据
2. 概念:
成员变量:
属性:setter和getter方法截取后的产物
例如:getUsername() --> Username--> username
3. 方法:
1. setProperty()
2. getProperty()
3. populate(Object obj , Map map):将map集合的键值对信息,封装到对应的JavaBean对象中
1.响应也是分三部分
响应行:
组成: 协议 状态码 状态描述
状态码:
404: ---->浏览器访问的资源不存在, 路径写错了!!!!!
500: ----> 代码写的有问题, 该代码, --->先要去找到错误代码的位置
302: ---->告诉浏览器要重定向
响应头:
作用:响应头可以给浏览器下命令,让浏览器按照我们的想法解析数据
白话:其实浏览最在乎响应体,显示的内容,程序员可以通过响应头来控制显示方式,显示编码....
常见的头:
content-type ---->可以让浏览器按照想要的格式以及编码解析
content-disposition ----> 可以让浏览器以默认打开方式解析,还是以附件解析(下载时候才会用到);
location ----> 可以给浏览器一个地址, 可以配合302的状态码一起完成重定向的动作
响应体
显示的内容!!!!!
2.Response对象
操作响应行:
setStatus(int 状态码的值); ---->设置状态码
操作响应头
setHeader(String key,String value);
操作响应体:
getOutputStream() ---->获取字节流
getWrite() ------> 获取字符流
3.Response的作用
1.完成重定向
最终写法:
resp.sendRedirect("路径");
其实内部分成两个步骤
setStatus(302)
setHeader("location",路径)
4.路径问题:
相对:
以./或者../开始的路径
技巧:找对(当前)和(目标)的关系
绝对:
以"/"开始的:
其实绝对路径前面省略
客户端路径: -----> src, action, "重定向"都是客户端路径
"http://ip地址:端口" ----> 但是如果你自己规定"http://ip地址:端口" 他就不会默认加了!!!!!!!
服务器路径: -----> 只有"转发"是服务器路径
"http://ip地址:端口/虚拟路径"
虚拟路径建议我们动态获取 -----> req.getContextPath();可以动态获取虚拟路径
5.如何输出字符数据到页面
格式: resp.getWriter().write("内容");
注意:
如果中文会出现乱码!!!
原因:
resp.getWriter(); 这个流是tomcat帮我们创建的流, 他采用默认编码是ISO-8859-1,它不支持中文,
解决方案:
1.设置writer的流的编码为"utf-8"; ---> resp.setCharacterEnconding("utf-8");
2.告诉浏览器以"utf-8"的方式来解析 ---> resp.setHeader("content-type","text/html;charset=utf-8");
我们最终的写法:
resp.setContnxtType("text/html;charset=utf-8");
6.ServletContext
作用: 他是和tomcat通信的桥梁, 原因: ServletContext是Tomcat为每一个项目创建的,专门用和tomcat交互的对象,每一个项目只有一个ServletContext对象,
特点: 每一个项目只有一个ServletContext对象, 而且这个Tomcat为每一个项目创建的
功能:
1.获取文件的MIME类型(了解!!!!)
MIME: 可以让浏览器以指定引擎解析你的数据 ----> .jpg .png ---> text/html IMG/JEPG
注意:高版本浏览器(除了ie),都会自动识别类型
2.可以作为域对象存储数据 setAttr... getAttr.... , removeAttr....(用的很少!!!!!)
作用范围: 整个项目中有效, 所有的用户共享的东西放到这里
3.获取文件的服务器端的真实路径
其实为File,自己的创建的流而服务的, 原因File或者自己的创建的流不能采用相对路径, 不然都相对于tomcat/bin目录下,
这是一定要绝对路径, 而绝对路径通过ServletContext对象来获取, 因为他可以读取catalina/localhost/xxx.xml得到docBase
指向的项目的真实路径, 可以通过ServletContext对象getRealPath获取绝对路径!!!!
注意: 一定注意自己的启动环境是谁!!!!!
4.获取全局的参数:(用的也很少!!!!!)
在web.xml中:
<context-param>
<param-name>username</param-name>
<param-value>zhangsan</param-value>
</context-param>
String getInitParameter(String key);
例如:
String value = getServletContext().getInitParameter("username");
增 ----> add, append,put,insert
删 ----> remove delete drop
该 ----> alter ,update, set
查 ----> get, select
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2