Servlet的2种请求:get请求、post请求
get请求、post请求区别:
1、get请求,请求的数据会附加在URL(统一资源定位器)之后,以?分割URL和传输数据,多个参数用&连接
post请求:把请求的数据放置在HTTP请求包的包体中
get请求:数据会暴露在地址栏中,而post请求不会(比较私密,会把数据隐藏起来)
2、传输数据的大小
HTTP规范中,没有对URL的长度和传输的数据大小进行限制。但是在开发中,对于get,特定的浏览器和服务器对URL长度有限制
即:get请求时传输数据会受到URL长度的限制,各个服务器会规定post提交数据大小进行限制
GET 方法有大小限制:请求字符串中最多只能有 1024 个字符。
3、安全性
post的安全性比GET的高(对于一般含密码之类的用post请求)
常用方法:
1、String getParameter(String name):根据表单组件名称获取提交数据,返回值是String(服务器在接收数据时使用字符串统一接收)(可以用于接收返回数据)
2、String[] getParameterValues(String name):获取表单组件对应多个值时的请求数据
3、void setCharacterEncoding(String charset):指定每个请求的编码(针对post请求才起作⽤)
4、RequestDispatcher getRequestDispatcher(String path) --跳转⻚⾯,返回⼀个RequestDispatcher对象,该对象的forward( )⽅法⽤于转发请求
Servlet读取表单数据
1、getParameter():您可以调用 request.getParameter() 方法来获取表单参数的值。
2、getParameterValues():如果参数出现一次以上,则调用该方法,并返回多个值,例如复选框。
3、getParameterNames():如果您想要得到当前请求中的所有参数的完整列表,则调用该方法。
客户端如何发送数据给服务器
1、通过表单(form)get/post提交
2、通过a标签(href)发送数据(get提交):第⼀个参数使⽤?拼接,之后的参数使⽤&拼接
3、通过地址栏直接拼接——get请求
4、js提交数据——get请求
Servlet的生命周期(从servlet出现到消亡的全过程)
三个方法: 利用接口implements Servlet可以实现重写
1、init()初始化阶段
2、service() 处理客户端请求阶段 ---> 处理请求的具体实现
service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。
3、destroy() 终止阶段 -->回收时调用
转发和重定义:
重定义(sendRedirect):(属于客户端行为) 服务器在收到客户端请求后,会通知客户端浏览器重新向另外一个URL发送请求
本质上会发送两次HTTP请求
转发(forward):(服务器行为)将用户对当前jsp页面或servlet请求转发给另一个jsp页面或servlet并进行传递
转发和重定义比较(区别):
1、原理不同:都是由服务器控制,但重定义在客户端进行跳转,两个请求,而转发在服务器端进行跳转,一个请求
2、语法不同:转发:req.getRequestDispatcher("转发页面的地址").forward(req,resp);重定义resp.sendRedirect("./first");
3、跳转范围不同:重定义整个互联网;转发:当前项目
4、跳转后获取保存:转发可以得到req对象和resp对象中内容;重定义得不到req对象和resp对象的内容,因为相当于一个新的请求
5、效率不同:转发效率高于重定义
6、浏览器地址栏URL是否发生变化:转发不会;重定义会
转发和重定义的选择:
1、使用重定义情况:跳转到不同的应用(只能用重定义)使用Cookie存储数据
2、使用转发:希望前后两个组件共享req数据;跳转到同一个WEB-INF目录下(只能选择转发)
作用域:page、request、session、application(作用域大小依次增大)
1、page:在当前页面有效
生命周期:当请求时开始,响应结束时销毁
2、request:在一个完整的请求中有效
3、session:只要浏览器不关闭就有效
4、application:只要服务器不关闭就有效
Cookie:是一种浏览器缓存,是保存在客户端的纯文本文件,可减少服务器的压力
步骤:
1、创建一个Cookie对象写入cookie
2、设置过期时间
3、添加到HTTP响应头
4、获取返回给客户端的Cookie数组
5、遍历取出每个cookie
cookie与session的区别:
1、从存储方式上:cookie只能存储字符串,如果存储非ASCII字符串还要对其编码;session可以存储任何类型的数据
2、从隐私安全上: cookie存储在浏览器中,对客户端是可见的,存在安全问题,如果使用需进行加密;session存储在服务器中,对客户端是透明的,不存在安全泄漏问题
3、从有效期上:cookie保存在硬盘中,关闭浏览器仍存在;session保存在服务器中,关闭浏览器,没有从服务器消亡但也失效
4、从对服务器的负担:session保存在服务器中,每一个用户都会产生一个session,如果并发访问用户多,不能使用session会消耗大量内存;Cookie是保存在客户端的。不占用服务器的资源。像baidu、Sina这样的大型网站,一般都是使用Cookie来进行会话跟踪。
5、从浏览器的支持上:如果浏览器禁用了cookie,那么cookie是无用的,但session可以通过URL地址重写进行会话跟踪
6、从跨域名上:cookie可以设置domain属性来实现跨域名;session只在当前的域名内有效,不可夸域名
过滤器:过滤器是处于客户端和服务端目标资源之间的过滤技术。在客户端发送请求时,会先经过过滤器,在到servlet,响应时会根据执行流程再次反向执行过滤器。
过滤器的作用:
1. 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息,也就是说可以监视,修改或以某种方式处理客户端与服务端下在交流的数据
2.过滤器是可用于 Servlet 编程的 Java 类,可以实现以下目的:
(1)在客户端的请求访问后端资源之前,拦截这些请求。
(2)在服务器的响应发送回客户端之前,处理这些响应。
创建过程:
1、实现javax.servlet.Filter接口
2、实现init方法,读取过滤器的初始化参数
3、 实现doFilter方法,完成对请求或响应的过滤
4、 调用FilterChain接口对象的doFilter方法,向后续的过滤器传递请求或响应
实现接口Filter
init():初始化
doFilter(ServletRequest req, ServletResponse resp, FilterChain chain):
ServletRequest req:处理请求的
ServletResponse resp:处理响应
这两个参数需要做类型强转,变为HttpServletRequest,HttpServletResponse
FilterChain chain:放行,如果还有过滤器则进入下一个过滤器,没有则进入servlet
destroy():销毁
案例:
编码过滤
登录认证
Sevlet的MVC模式
MVC概念
MVC是模型(model)视图(view) 控制器(controller)
模型:用于存储数据以及处理用户请求的业务逻辑
视图:向控制台提交数据,显示模型中的数据
控制台:根据视图提出的要求,判断将请求和数据交给那个模型处理,处理后的有关结果交给那个视图更新显示
基于 Servlet 的 MVC 模式的具体实现如下。
模型:一个或多个 JavaBean 对象,用于存储数据(实体模型,由 JavaBean 类创建)和处理业务逻辑(业务模型,由一般的 Java 类创建)。
视图:一个或多个 JSP 页面,向控制器提交数据和为模型提供数据显示,JSP 页面主要使用 HTML 标记和 JavaBean 标记来显示数据。
控制器:一个或多个 Servlet 对象,根据视图提交的请求进行控制,即将请求转发给处理业务逻辑的 JavaBean,并将处理结果存放到实体模型 JavaBean 中,输出给视图显示。
Servlet的三层架构
Servlet(controller):处理JSP页面传输的数据,一般通过req.getParameter获取表单中属性为name参数中的value值,在Servlet层中一般会通过new的方式创建一个Service
User Service user= new UserServiceimpl();因为Service层会创建一个接口写一些方法,并创建一个实现类实现这个接口
Service层:处理前端传输的数据进行数据库的增删改查,或者处理dao层从数据库获取的数据
dao层:用来与数据库进行交互,也就是增删改查。可以通过前端传输过来的数据对用户的信息进行增删改查
--> 先写入实现类(entity) --> 建立数据库连接(设置驱动、连接数据库、关流)
--> dao层创建接口并实现类(类中可以进行对数据库的增删改查)
--> service层创建dao层的对象(userDao ud = new userDaoImpl();)并进行处理。 可以展示到浏览器页面处理前端数据
--> controller层创建service层的对象(userService us = new userServiceImpl();)处理JSP页面传输的数据
--> 最后在结果前端页面(web)现在修改