目录
1、Servlet程序
1.1 什么是servlet?
1.2 Servlet程序的实现
1.3 servlet的生命周期
1.4 servlet请求的分发处理(get和post请求)
1.5 通过继承HttpServlet实现servlet接口
1.6 IDEA直接创建Servlet程序
1.7 Servlet继承关系
1.8 ServletConfig类
1.9 ServletContext对象
1.10 Http协议
1.11 常用的请求头类型
1.12 GET请求和POST请求怎么区分?
1.13 响应的Http协议介绍
1.14 常见的响应状态码
1.15 MIME类型说明(HTTP协议中的数据类型)
1.16 HttpServletRequest类
1.17 请求的转发(servlet1 => servlet2)
1.18 base标签的作用
1.19 "/"不同的解析结果
1.20 HttpServletResponse类
1.21 请求重定向
1.22 JavaEE三层架构(SSH和SSM框架的由来)
1.23 书城项目第二阶段
1、Servlet程序
1.1 什么是servlet?
①Servlet是JavaEE规范之一,就是接口。
②Servlet是JavaWeb三大组件之一,三大组件分别是:Servlet程序,Filter过滤器、Listener监听器。
③Servlet是运行在服务器上的小程序,他可以接收客户端发来的请求并响应数据给客户端。
1.2 Servlet程序的实现
①、编写一个类去实现Servlet接口 (Web工程中src文件夹新建一个Package,再新建class implements Servlet,通过ALT + insert——>Implement Methods重点关注service方法)。②、实现Service方法,处理请求,并响应数据。(如最简单的System.out.println("HelloServlet被访问了"))③、到web.xml中去配置servlet程序的访问地址。
添加 注意: ①servlet-class的类不要从com.xxx.xxx.xxx开始敲,直接输入类名就可以,否则无法对应到你想要的对应的那个java类,具体原因我也不清楚②url-parttern中/xxx需要与java类有逻辑上的对应关系,否则可读性非常差 ①servlet构造器方法 get请求和post请求执行的操作不一样,但是service函数只有一个,因此需要判断请求类型区别对待,借助getMethod()方法 ①ServletRequest的子类可以调用getMethod()方法,入口参数类型为ServletRequest类型,因此需要先通过其子类实例化:HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequest 一般开发过程中不直接从Servlet接口实现,而是从他的子类进行实现 ①src包右键New——>Servlet(如果没有再检查一下依赖) 注意: Servlet————>接口,负责定义Servlet程序的访问规范 从名称上看就知道是Servlet程序的配置信息类 补充说明: ①是一个接口,表示上下文对象 Map:存数据用put(),取数据用get(),删除数据用remove() 四个作用: 200 表示请求成功 服务器收到请求后,从一个资源跳转到另一个资源的操作 特点:
1.3 servlet的生命周期
②init初始化方法
第一次访问的时候调用,单例
③service方法
每次刷新都会重新调用该方法
④destroy销毁方法
销毁的时候调用该方法1.4 servlet请求的分发处理(get和post请求)
②String method = httpServletRequest.getMethod();
此外由于get和post执行的操作可能不止一个,在通过getMethod方法获取到请求类型后,通常在外面通过自定义函数的方式,进行封装,之后再进行调用。1.5 通过继承HttpServlet实现servlet接口
①编写一个类去继承HttpServlet类(注意这里的是类不是接口)
②根据业务需要重写goGet或doPost方法(注意需要删除第一行的super.……否则会调用父类中的方法,网页会给出405的错误提示)
③到web.xml中配置Servlet程序的访问地址1.6 IDEA直接创建Servlet程序
②填写类名、包名、全包名自动生成
①去选下面的勾选项,不使用3.0以上版本的注解
②包名是从点击的resourceRoot开始算的,即从右键选中的文件夹开始算的,如果之前没有该包名会新建一个对应的包
③新建完成后仍需要在web.xml中配置地址1.7 Servlet继承关系
GenericServlet——>作为类,实现了Servlet接口,做了很多空实现,并持有一个ServletConfig类的引用
HttpServlet——>抽象类实现了service方法,实现了请求的分发处理,负责抛异常,提示不支持Get/Post请求
自定义的Servlet——>重写doGet和doPost方法1.8 ServletConfig类
(在继承自Servlet的类中alter+insert即可快速引入接口函数,其中Init函数的入口参数中即有此servletConfig)
①可以获取Servlet程序的别名servlet-name的值
servletConfig.getServletName();
②获取初始化init-param
a.在web.xml中对应的
b.通过servletConfig.getInitParameter(name:"xxx")获取对应的参数的值
③获取ServletContext对象
servletConfig.getServletContext();获取ServletContext对象
①Servlet程序和ServletConfig对象都是由Tomcat服务器创建,我们使用即可
②Servlet程序默认是第一次访问的时候创建,ServletConfig是每个Servlet程序创建时,就创建一个对应的ServletConfig对象,因此每次获取ServletConfig对象的时候智能获取自身的,不能获取别的。getServletConfig()也能获取对象,但是获取到的ServletConfig对象是GenericServlet类中的,如果继承的类中重写Init()方法,需要super.init(config),否则会导致父类中的this.config = config操作丢失而引起子类中的空指针异常。1.9 ServletContext对象
②一个Web工程,只有一个ServletContext对象实例
③是一个域对象:可以像Map一样存取数据的对象,这里的域指的是存取数据的操作范围
④ServletContext会在Web工程部署启动的时候创建,在web工程停止的时候销毁
域对象:存数据用setAttribute(),取数据用getAttribute(),删除数据用removeAttribute()
①获取web.xml中配置的上下文参数context-param(属于整个Web工程的)
ServletContext context = getServletConfig().getServletContext();
context.getInitParameter(name:"xxxx")
②获取当前的工程路径,格式:/工程路径
context.getContextPath();
③获取工程部署后在服务器硬盘上的绝对路径
context.getRealPath("/")(/被浏览器解析为http://ip:端口号/工程名/ 映射到IDEA代码的web目录
)
④像Map一样存储数据
context.setAttribute(name:"xxx",object:"xxxx");
context.getAttribute(name:"xxx");
存储范围为整个web工程1.10 Http协议
①GET请求
a.请求行
请求的方式: GET
请求的资源路径:[+?+请求参数]
请求的协议的版本号 HTTP/1.1
b.请求头
key:value组成,不同的键值对表示不同的含义
浏览器F12打开开发者调试界面,在提交表单内容的时候可以观察到请求行和请求头的内容,如2.11所述:
②POST请求
a.请求行
请求的方式: POST
请求的资源路径:[+?+请求参数]
请求的协议的版本号 HTTP/1.1
b.请求头
key:value组成,不同的键值对表示不同的含义
空行
c.请求体
即发送给服务器的数据
1.11 常用的请求头类型
①Accept: text/html, application/xhtml+xml, image/jxr, */*(表示客户端可以接收的数据类型)
②Accept-Encoding: gzip, deflate(客户端可以接收的数据编码(压缩)格式)
③Accept-Language: zh-CN(客户端可以接收的语言类型)
④Connection: Keep-Alive(告诉当前服务器当前请求连接如何处理,还有一种为closed)
⑤Host: localhost:8080(请求的服务器IP和端口号)
⑥Referer: http://localhost:8080/servlet/test.html(当前请求是从哪里产生的)
⑦User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko(浏览器的信息)
⑧Content-Type:表示发送的数据类型
application/x-www-form-urlencoded
表示提交的数据格式是:name=value&name=value,然后对其进行url编码
url编码就是把非英文的内容转换为:%xx%xx
multipart/form-data
表示以多段的形式提交数据给服务器(以流的形式提交,用于上传)
⑨Content-Length:表示发送的数据的长度
⑩Cache-Control:表示如何控制缓存(no-cache不缓存)
1.12 GET请求和POST请求怎么区分?
GET请求:
①form标签,method="get"
②a标签
③link标签引入css
④script标签引入js文件
⑤img标签引入图片
⑥iframe引入html页面
⑦在浏览器地址栏中输入地址后敲回车
POST请求:
①form标签 method="post"
1.13 响应的Http协议介绍
a.响应行
响应的协议和版本号 HTTP/1.1
响应状态码 200
响应状态描述符 OK
b.响应头
key:value 不同的响应头有其不同的含义
空行
c.响应体
回传给客户端的数据
1.14 常见的响应状态码
302 表示请求重定向
404 表示请求服务器已经收到了,但是你要的数据不存在(请求地址错误)
500 表示服务器已经收到请求,但是服务器内部错误(代码错误)1.15 MIME类型说明(HTTP协议中的数据类型)
英文全称是:Mutipurpose Internet Mail Extensions 多功能Internet邮件扩充服务
类型格式:大类型/小类型
超文本标记语言文本 .html,.htm text/html
普通文本 .txt text/plain
RTF文本 .rtf application/rtf(苹果和linux操作系统上常见,windows几乎不用)
GIF图形 .gif image/gif
JPEG图形 .jpeg,.jpg image/jpeg
au声音文件 .au audio/basic
MIDI音乐文件 mid,midi audio/midi,audio/x-midi
RealAudio音乐文件 .ra,.ram audio/x-pn-realaudio
MPEG文件 .mpg,.mpeg video/mpeg
AVI文件 .avi video/x-msvideo
GZIP文件 .gz application/x-gzip
TAR文件 .tar application/x-tar
1.16 HttpServletRequest类
每次只要有请求进入Tomcat服务器,Tomcat服务器就回吧请求过来的HTTP协议信息解析好封装到Request对象中,然后传递到service方法(doGet和doPost)中供我们使用,我们可以通过HttpServletRequest对象获取到所有请求的信息
常用方法有:
①getRequestURI() 获取请求的资源路径
②getRequestURL() 获取请求的统一资源定位符(绝对路径)
③getRemoteHost() 获取客户端的ip地址
④getHeader() 获取请求头
⑤getParameter() 获取请求参数
⑥getParameterValues() 获取请求的参数(多个值的时候使用)
⑦getMethod() 获取请求的方式(GET还是POST)
⑧setAttribute(key,value) 设置域数据
⑨getAttribute() 获取域数据
⑩getRequestDispatcher() 获取请求转发对象
继承自HttpServlet类的doGet和doPost方法的入口参数中有HTTPServletRequest对象req
req.getRequestURI() => /工程名/资源路径
req.getRequestURL() => http://ip:端口号 + URI
req.getRemoteHost() => 127.0.0.1即localhost,如果使用真实的ip地址访问,得到的就是真实的客户端ip地址
req.getHeader(name:"User-Agent") => 可以获取发送请求的浏览器参数
req.getParameter(name:"xxx") => 获取参数(用String接收即可)
req.getParameterValues(name:"xxx") => 获取多个参数(用String[]接收,打印时Arrays.asList(xxx))
注意:
post请求在提交表单的时候会出现中文乱码的问题,解决办法:在获取请求参数之前,通过setCharacterEncoding("UTF-8")方法解决乱码问题。必须在获取任何请求参数之前使用,在获取任何一个参数之后再调用就会失效。
1.17 请求的转发(servlet1 => servlet2)
流程:req.getParameter(name:"……")(检查资料) => req.setAttribute(name:"xxx",value:"xxx")(盖章) => req.getRequestDispatcher("/servlert2")(问路) => xxxDispatcher.forward(req,resp)(跳转)
①浏览器地址栏没有变化
②他们是一次请求
③他们共享req域中的数据(Attribute)
④可以转发到WEB-INF目录下(直接访问的话浏览器禁止访问)
⑤是否可以访问工程以外的资源?不能!
1.18 base标签的作用
用于设置页面相对路径工作时参照的地址
使用base标签的原因:
使用a标签进行跳转的时候"/a/b/c.html",通过"../../index.html"跳转回去没有问题,当使用请求转发的方式进行跳转的时候跳转过去没问题,通过servlet-mapping实现跳转。但是跳转回来的时候由于../../是相对路径,与浏览器当前的地址有关,回退到错误的地址导致跳转回来失败,这时候即可以使用base标签使之从base标签开始使用相对路径跳转。
一般base标签放在title标签下面,如:
1.19 "/"不同的解析结果
如果被浏览器解析,得到的地址是:http://ip:端口号/
斜杠
如果被服务器解析,得到的地址是:http://ip:port/工程路径
①
1.20 HttpServletResponse类
与HttpServletRequest类相似,每次请求进来,Tomcat服务器都会创建一个Response对象传递给Servlet程序去使用,通过设置该对象设置返回给客户端的信息
两个输出流:
字节流 getOutputStream() 常用于下载(传递二进制数据)
字符流 getWriter() 常用于回传字符串(常用)
两个流只能二选一,否则会报错
默认响应的编码为ISO-8859-1,此时解析服务器返回给客户端的中文会出现乱码问题,解决办法:
方法一:
①通过resp.setCharacterEncoding("UTF-8")设置服务器编码为UTF-8
②通过响应头设置客户端的浏览器也使用UTF-8字符集解析页面:resp.setHeader(name:"content-Type",value:"text/html;charset=UTF-8")
需要同时设置服务器和浏览器的字符集,少一个都不可以
方法二:
//这一行代码会同时设置服务器和客户端都使用UTF-8字符集,还设置了响应头
resp.setContentType("text/html;charset=UTF-8")
注意:方法二一定要在获取流对象之前调用才有效
1.21 请求重定向
是指客户端给服务器发请求,然后服务器告诉客户端,给你一下新地址,你去新地址访问。(因为之前的地址可能已经被废弃)
①告知客户端此地址已搬迁 ==>> 响应码 302
②并且告知新的地址 ==>> 响应头 Location
方法一:
resp.setStatus(302) ==>> 表示重定向
resp.setHeader(name:"Location",value:"新地址") ==>> 设置响应头,告知新地址
方法二:(推荐使用)
resp.setRedirect(location:"新地址")
特点:
①地址栏会发生变化
②两次请求
③不共享req的Attribute域数据
④不能访问WEB-INF下的资源
⑤可以访问工程外的资源(如访问百度)
1.22 JavaEE三层架构(SSH和SSM框架的由来)
①Web层/视图展现层 ==>> Sevlet程序、SpringMVC
a.获取请求参数,封装成Bean对象
b.调用service层处理业务
c.响应数据给客户端、请求转发、重定向
②Service业务层 ==>> Spring框架
a.处理业务逻辑
b.调用持久层保存到数据库
③Dao持久层 ==>> Jdbc、DbUtils、Mybatis、Hibernate
Dao持久层,只负责跟数据库交互,执行CRUD操作
分层的目的是为了实现解耦,降低代码的耦合度,方便项目后期的维护和升级
①Web层 com.atguigu.web/servlet/controller
②Service层 com.atguigu.service Service接口包 + com.atguigu.service.impl Service接口实现类
③Dao层 com.atguigu.dao Dao接口包 + com.atguigu.dao.impl Dao接口实现类
④实体Bean对象 com.atguigu.pojo/entity/domain/bean JavaBean类
⑤测试包 com.atguigu.test/junit
⑥工具类包 com.atguigu.utils
1.23 书城项目第二阶段
①创建项目所需的数据库和表
②编写数据库表所对应的JavaBean对象(属性、getter&setter、toString、Structure)
③编写工具类JdbcUtils
④编写baseDao
⑤编写UserDao和测试 => 接口
注意:
①在编写工具类JdbcUtils时,需要用到jdbc.properties配置文件,尚硅谷视频教程中是放在src目录下的,但是由于用的IDEA版本不同,构建的项目结构也有所不同,查CSDN后发现,只有将jdbc.properties文件放在/src/main/resources里面才能使getResourceAsStream()方法读取到,否则就会报空指针异常,据CSDN上反映,后面将工程部署在web上时可能会出现新找不到文件的问题。
根本原因是需要将存放property配置文件的文件夹右键mark directory as resource root



