(四)Servlet

(四)Servlet


一、C/S架构和B/S架构

C/S架构(Client/Server 客户端/服务器)

  • 特点:必须在客户端安装特定软件
  • 优点:图形效果显示较好(如:3D游戏)
  • 缺点:服务器的软件和功能进行升级,客户端也必须升级、不利于维护
  • 常见的C/S程序:QQ、微信等

B/S架构(Browser/Server 浏览器/服务器)

  • 特点:无需安装客户端,任何浏览器都可直接访问
  • 优点:涉及到功能的升级,只需要升级服务器端
  • 缺点:图形显示效果不如C/S架构
  • 需要通过HTTP协议访问

二、服务器

(1)什么是Web

Web(World Wide Web) 称为万维网,简单理解就是网站,它用来表示Internet主机上供外界访问的资源。

Internet上供外界访问的资源分为两大类

  • 静态资源:指Web页面中供人们浏览的数据始终是不变的。(HTML、CSS)
  • 动态资源:指Web页面中供人们浏览的数据是由程序产生的,不同时间点,甚至不同设备访问Web页面看到的内容各不相同。(JSP/Servlet)

(2)什么是Web服务器

Web服务器是运行及发布Web应用的容器,只有将开发的Web项目放置到该容器中,才能使网络中的所有用户通过浏览器进行访问。

(3)tomcat的下载与部署

1)下载并解压

官网下载( http://tomcat.apache.org/ )Tomcat8.5解压缩版本

将Tomcat解压到纯英文的文件夹中

2)部署

(1) 修改 Tomcat 目录下的 bin 目录的 catalina.bat 文件
在 setlocal(大概在第109行) 上添加:
set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_241\bin(此路径为jdk中的bin的路径)
set JRE_HOME=C:\Program Files\Java\jdk1.8.0_241\jre(此路径为jdk中的jre的路径)

(2)配置环境变量
新建:
CATALINA_BASE
F:\tools\apache-tomcat-8.5.30(tomcat 的路径)
CATALINA_HOME
F:\tools\apache-tomcat-8.5.30(tomcat 的路径)
编辑path并添加:
%CATALINA_BASE%\bin;%CATALINA_HOME%\bin;

(3)idea 导入 tomcat 服务器
Run --> Edit Config… --> “+” --> Tomcat Service --> local --> Server(Configure将tomcat添加进来和选择浏览器)–> Deployment(点击"+"号将项目添加到tomcat中)–>回到Server将URL填写完整(每次启动tomcat默认运行的html文件)


三、Servlet配置

(1)将tomcat的类库添加到项目环境中

File --> Project Struc… --> Modules --> Dependencies --> “+” --> Library --> Tomcat

(2)编写Servlet

(1)前端代码

<body>
    <form action="MyServlet" method="post">
        <input type="submit">
    </form>
</body>

(2)自定义MyServlet类,继承 HttpServlet 类,重写 doPost() 和 doGet()

public class MyServlet extends HttpServlet {
	@Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.getWriter().write("doPost");
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	response.getWriter().write("doGet");
    }
}

(3)配置 WEB-INF 中的 web.xml ,在< web-app>标签内添加

<!--1、添加servlet节点-->
<servlet>
	<servlet-name>MyServlet</servlet-name>
	<servlet-class>com.fa.servlet.MyServlet</servlet-class>
</servlet>
<!--2、添加servlet-mapping节点-->
<servlet-mapping>
	<servlet-name>MyServlet</servlet-name>
	<url-pattern>/MyServlet</url-pattern>
</servlet-mapping>

四、Servlet应用

(1)request对象(请求)

在Servlet中用来处理客户端请求需要用doGet或doPost方法的request对象,有作用域

1)get和post的区别

get请求:

  • get提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连
  • get方式明文传递,数据量小,不安全
  • 效率高,浏览器默认请求方式为GET请求
  • 对应的Servlet的方法是doGet

post请求:

  • post方法是把提交的数据放在HTTP包的Body中
  • 密文传递数据,数据量大,安全
  • 效率相对没有GET高
  • 对应的Servlet的方法是doPost
2)主要方法

String getParameter(String name); 根据表单组件名称获取提交数据
void setCharacterEncoding(String charset); 指定每个请求的编码

3)post中文乱码

产生乱码是因为服务器和客户端沟通的编码不一致造成的,因此解决的办法是:在客户端和服务器之间设置一个统一的编码,之后就按照此编码进行数据的传输和接收

Tomcat8及以后的get方式不会出现乱码了,因为服务器对url的编码格式可以进行自动转换,不过post方式还是会出现乱码

解决方案:
在doPost方法的首行添加如下代码

request.setCharacterEncoding("utf-8");
response.setContentType("text/html;Charset=utf-8");

(2)response对象(响应)

response对象用于响应客户请求并向客户端输出信息,没有作用域

1)主要方法

setHeader(name,value); 设置响应信息头
setContentType(String); 设置响应文件类型、响应式的编码格式
setCharacterEncoding(String); 设置服务端响应内容编码格式
getWriter(); 获取字符输出流


五、Servlet生命周期

(1)生命周期四个阶段

1)实例化

客户端发送请求到达服务器,服务器根据项目的 web.xml 配置信息找到相应的 Servlet 对象

2)初始化

如果是初次发送请求,先执行 init() 方法,再去执行 service() 方法

3)服务

如果不是初次访问 Servlet ,只会执行 service() 方法,service() 根据提交方式决定调用 doGet() 还是 doPost(),默认是 doGet()

4)销毁

销毁 Servlet 对象会执行 destroy() 方法一次

5)Servlet执行流程

在这里插入图片描述


六、转发与重定向

(1)转发:一次请求,能传递数据

转发的作用在服务器端,将请求发送给服务器上的其他资源,以共同完成一次请求的处理,两次跳转之间传输的信息不会丢失。

主要代码:

  • request.getRequestDispatcher(“目标url”).forward(request, response);

在这里插入图片描述

(2)重定向:至少两次请求,不能传递数据

重定向作用在客户端,客户端将请求发送给服务器后,服务器响应给客户端一个新的请求地址,客户端重新发送新请求,两次跳转之间传输的信息会丢失。

主要代码:
response.sendRedirect(“目标url”);

在这里插入图片描述


七、三大作用域

(1)Request

1)request概述

(1)request是一个请求,只要发送一个请求就会创建一个request对象,这个对象只在本次请求中有效。
(2)一般用于不同页面之间的同一请求,比如表单的传值,a链接的传值跳转等。

2)request常用方法

(1)request.setAttribute(“user”,user):保存数据
(2)request.getAttribute(“user”):获取数据
(3)request.removeAttribute(“user”):删除数据
(4)request.getParameter(“user”):获取url中名为user的值

请求级别的作用域 – 请求改变,数据丢失 – 存储一次性数据使用

(2)Session

1)session概述

Session是服务器为每个访问这个服务器的客户端创建的一个容器,用于记录客户端的状态。

2)session原理

(1)服务器会为每一次会话分配一个Session对象
(2)同一个浏览器发起的多次请求,同属于一次会话(Session)
(3)首次使用到Session时,服务器会自动创建Session,并创建Cookie存储SessionId发送回客户端,只要客户端不关闭,再去访问服务器时,都会带着sessionid,服务器发现客户端带着sessionid,就会使用内存中与之对应的session为之服务

3)session使用

浏览器会话级别的作用域,拥有存储数据的空间,存储用户独有的数据,作用范围是一次会话有效

  • 一次会话是使用同一浏览器发送的多次请求。一旦浏览器关闭,则结束会话
//获取Session对象,session是服务器端自动创建的,通过request对象获取
HttpSession session=request.getSession();

//Session保存数据
session.setAttribute("key",value);//以键值对形式存储在session作用域中。

//Session获取数据
session.getAttribute("key");//通过String类型的key访问Object类型的value

//Session移除数据
session.removeAttribute("key");//通过键移除session作用域中的值
4)浏览器禁用Cookie解决方案

服务器在默认情况下,会使用Cookie的方式将sessionID发送给浏览器,如果用户禁止Cookie,则sessionID不会被浏览器保存;此时,服务器可以使用如URL重写这样的方式来发送sessionID。

(1)URL重写
浏览器在访问服务器上的某个地址时,不再使用原来的那个地址,而是使用经过改写的地址(即在原来的地址后面加上了sessionID)。

(2)实现URL重写
response.encodeRedirectURL(String url)生成重写的URL。

//重写URL追加SessionId
//response. encodeRedirectURL(java.lang.String url)用于对sendRedirect方法后的url地址进行重写
String url = response.encodeRedirectURL(request.getContextPath()+"/servlet/ListCartServlet");
System.out.println(url);
response.sendRedirect(url);

(3)ServletContext

1)ServletContext概述

(1)全局对象,也拥有作用域,对应一个Tomcat中的Web应用,存储所有用户共享的数据。
(2)当Web服务器启动时,会为每一个Web应用程序创建一块共享的存储区域(ServletContext)。
(3)ServletContext在Web服务器启动时创建,服务器关闭时销毁。

2)ServletContext作用
//获取当前项目在服务器发布的真实路径
String realpath = getServletContext().getRealPath(path);

//获取当前项目上下文路径(应用程序名称)
System.out.println(servletContext.getContextPath());
3)全局容器

ServletContext拥有作用域,可以存储数据到全局容器中

  • 存储数据:servletContext.setAttribute(“name”,value);
  • 获取数据:servletContext.getAttribute(“name”);
  • 移除数据:servletContext.removeAttribute(“name”);
4)ServletContext特点

唯一性: 一个应用对应一个ServletContext。
生命周期: 只要容器不关闭或者应用不卸载,ServletContext就一直存在。


八、过滤器

(1)概念

过滤器(Filter)是处于客户端与服务器目标资源之间的一道过滤技术;
是对客户端访问服务器目标资源的过滤,符合条件放行,不符合条件不放行。

在这里插入图片描述

(2)生命周期

服务器启动时filter对象创建,服务器关闭时filter对象销毁

(1)init():filter对象创建时执行
(2)doFilter():filter执行过滤的核心方法,如果该资源被配置到 filter 进行过滤,那么每次访问这个资源都会执行 doFilter 方法
(3)destory():filter对象销毁时执行

(3)作用

(1)一方面可以过滤掉不需要的内容,也可以对内容进行加工处理;
(2)用来拦截不正常登录传入的请求和传出的响应;
(3)可以解决多个Servlet共性代码的冗余问题(例如:乱码处理、登录验证)。

(4)编写过滤器

编写一个java类实现Filter接口,这个java类就是一个过滤器

1)实现过程

(1)编写java类实现Filter接口
(2)在doFilter()方法中编写拦截逻辑
(3)设置拦截路径

@WebFilter("/MyServlet")//过滤路径
public class MyFilter implements Filter {

    //初始化过滤器
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化过滤器");
    }

    //执行过滤器
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //放行
        chain.doFilter(request, response);
    }

    //销毁过滤器
    @Override
    public void destroy() {
        System.out.println("销毁");
    }
}
2)过滤器路径

过滤器的过滤路径通常有三种形式:

  • 精确过滤匹配 ,比如/index.jsp /myservlet1
  • 后缀过滤匹配,比如*.jsp、* .html、 *.jpg
  • 通配符过滤匹配 /* ,表示拦截所有。注意过滤器不能使用 / 匹配
    /aaa/bbb/
    * 允许
3)过滤器优先级
  • 如果为注解的话,是按照类全名称的字符串顺序决定作用顺序
  • 如果web.xml,按照 filter-mapping注册顺序,从上往下
  • web.xml配置高于注解方式
  • 如果注解和web.xml同时配置,会创建多个过滤器对象,造成过滤多次

九、Cookie

(1)什么是Cookie

  • Cookie是在浏览器访问Web服务器的某个资源时,由Web服务器在HTTP响应消息头中附带传送给浏览器的一小段数据。
  • 一旦Web浏览器保存了某个Cookie,那么它在以后每次访问该Web服务器时,都应在HTTP请求头中将这个Cookie回传给Web服务器。
  • 一个Cookie主要由标识该信息的名称(name)和值(value)组成。

在这里插入图片描述

(2)创建Cookie

//创建cookie
Cookie cookie=new Cookie("name", name); 
//设置Cookie的路径
cookie.setPath("/");
//设置有效期限,取值有三种:>0,单位秒;=0,表示删除该Cookie;<0,浏览器关闭时删除,默认-1
cookie.setMaxAge(60*60);
//添加到response对象中,响应时发送给客户端
response.addCookie(cookie);

(3)获取Cookie

//获取所有的Cookie
Cookie[] cookies=request.getCookies();
//遍历Cookie
for(Cookie cookie:cookies){
	//检索出自己的Cookie
	if("name".equals(cookie.getName()))
	{
		//记录Cookie的值
		name=cookie.getValue();
		break;
	}
}

(4)删除Cookie

//key要一致,value可不填
Cookie cookie = new Cookie("name","");
//路径要一致
cookie.setPath("/");
//设置有效期为0,即删除cookie
cookie.setMaxAge(0);
//将cookie添加进去	
response.addCookie(cookie);

(5)Cookie编码与解码

Cookie默认不支持中文,只能包含ASCII字符,所以Cookie需要对Unicode字符进行编码,否则会出现乱码。

  • 编码使用java.net.URLEncoder类的encode(String str,String encoding)方法
  • 解码使用java.net.URLDecoder类的decode(String str,String encoding)方法
//创建带中文的cookie
Cookie cookie = new Cookie("name", URLEncoder.encode(name, "utf-8"));
response.addCookie(cookie);
//读取带中文的cookie
for(Cookie cookie : request.getCookies()){
	String cookieName = cookie.getName();
    String cookieValue = URLDecoder.decode(cookie.getValue(), "UTF-8");
    System.out.println(cookieName + "=" + cookieValue);
}

(6)Cookie优点和缺点

1)优点
  • 可配置到期规则。
  • 简单性:Cookie 是一种基于文本的轻量结构,包含简单的键值对。
  • 数据持久性:Cookie默认在过期之前是可以一直存在客户端浏览器上的。
2)缺点
  • 大小受到限制:大多数浏览器对 Cookie 的大小有 4K、8K字节的限制。
  • 用户配置为禁用:有些用户禁用了浏览器或客户端设备接收 Cookie 的能力,因此限制了这一功能。
  • 潜在的安全风险:Cookie 是以纯文本的形式保存的,可能会被篡改,会对安全性造成潜在风险。
  • 可能会被删除:每个Cookie 都是硬盘上的一个文件,很有可能会被用户删除。

(7)session和cookie的区别

(1)Cookie是把用户的数据写到用户的浏览器中。
(2)Session是把用户的数据写到用户独有的session中。
(3)Cookie对象是由客户端创建,有大小限制以及浏览器存cookie的个数也有限制。
(4)Session对象由服务器创建,没有大小限制和服务器的内存大小有关。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值