servlet学习笔记

Servlet请求中文乱码

1.使用String

String name=request.getParameter("name");
name=new String(name.getBytes("iso8859-1"),"utf-8");

浏览器默认编码iso8859-1,servlet默认编码utf-8

2.使用公共方式
设置请求编码格式

request.setCharacterEncoding("utf-8")

这种适用于post方式,get方式不适用
3.get方式设置
首先设置

request.setCharacterEncoding("utf-8")

然后在tomact的文件目录下的confg目录下的server.xml中设置:将Connector标签中增加属性 userBodyEncodingForURI=“true”

但这种方式不适用所有浏览器,核心数据可以使用String的方式

Servlet流程

1.设置请求编码格式
2.设置响应编码格式
3.获取请求信息
4.处理请求信息
5.响应处理结果

请求转发

实现多个servlet联动操作处理请求,这样避免代码冗余,让servlet的职责更加明确

 request.getRequestDispatcher(" 要转发某个servlet的地址 ").forward(request,response);

地址是相对路径,直接书写servlet的别名即可

一次请求,浏览器信息不变

请求转发后直接return结束即可

request的作用域

一次请求内的servlet共享一个request对象

第一个servlet的处理结果如何流转到第二个servlet

设置数据

request.setAttribute("key","value")

获取数据

request.getAttribute("key")

作用:解决了一次请求内的不同servlet的数据共享问题。基于请求转发,一次请求内的所有servlet共享

特点:
服务器创建
每次请求都会创建
生命周期一次请求
地址栏信息不改变

重定向

如果当前的请求,Servlet无法进行处理怎么办
如果使用请求转发,造成表达数据重复提交怎么办

response.sendRedirect("路径")

本地路径为URI (/项目名/servlet的别名) 也可直接使用servlet的别名
网络路径为定向资源的URL信息

特点:
两次请求
地址栏信息改变

时机:
如果请求中有表单数据,而数据又比较重要,不能重复提交,建议使用重定向
如果请求被servlet接收后,无法进行处理,建议使用重定向定位到可以处理的资源

Cookie学习

解决了不同的发送的请求的数据共享问题

设置cookie

创建Cookie对象

CooKie c=new Cookie("key","value");

响应Cookie对象给客户端

response.addCookie(c)

一个Cookie对象存储一条数据。多条数据,创建多个Cookie对象进行存储

特点:
浏览器端的数据存储技术,存到了浏览器的运行内存中
存储的数据声明在服务器端
临时存储:存储在浏览器的运行内存中,浏览器关闭即失效
定时存储:设置Cookie的有效期,存储在客户端的硬盘中,在有效期内符合路径要求的请求都会附带该信息

Cookie c=new Cookie("key","value")
c.setMaxAge(int expiry)  //int值以秒为单位     c.setMaxAge(3*24*3600) 三天

Cookie默认信息存储好之后,每次请求都会附带,除非设置有效路径

c.setPath("/项目名/servlet路径“)

只有请求该路径时,cookie的信息才会在请求中附带

获取cookie

Cookie[] cks=request.getCookies()

获取cookie信息数组
如果数组不为空,遍历数组获取cookie信息

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.com.bean.User;
import cn.com.service.LoginService;
import cn.com.service.impl.LoginServiceImpl;
/**
 * Cookie信息校验
 * 		判断请求中是否携带正确的Cookie信息
 * 		如果有则校验Cookie信息是否正确
 * 			如果校验正确则直接响应主页面给用户
 * 			如果校验不正确则响应登录页面给用户
 * 		没有则请求转发给登录页面
 */
public class CookieServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//设置请求编码格式
			req.setCharacterEncoding("utf-8");
		//设置响应编码格式
			resp.setContentType("text/html;charset=utf-8");
		//获取请求信息
			//获取Cookie信息
			Cookie[] cks=req.getCookies();
		//处理请求信息
			if(cks!=null){
				//遍历Cookie信息
					String uid="";
					for(Cookie c:cks){
						if("uid".equals(c.getName())){
							uid=c.getValue();
						}
					}
				//校验UID是否存在
					if("".equals(uid)){
						//请求转发
						req.getRequestDispatcher("page").forward(req, resp);
						return;
					}else{
						//校验UID用户信息
							//获取业务层对象
							LoginService ls=new LoginServiceImpl();
							User u=ls.checkUidService(uid);
							if(u!=null){
								//将数据存储在session中
								resp.getSession().setAttribute("user",u)
								//重定向
								resp.sendRedirect("/login/main");
								return;
							}else{
								//请求转发
								req.getRequestDispatcher("page").forward(req, resp);
								return;
							}
					}
				
			}else{
				//响应处理结果
					//请求转发
					req.getRequestDispatcher("page").forward(req, resp);
					return;
			}
	}
}

Session

解决一个用户的不同请求的处理需要使用相同的数据

原理:
用户使用浏览器第一次向服务器发送请求,服务器在接受到请 求后,调用对应的 Servlet 进行处理。在处理过程中会给用户创建 一个 session 对象,用来存储用户请求处理相关的公共数据,并将 此 session 对象的 JSESSIONID 以 Cookie 的形式存储在浏览器中 (临时存储,浏览器关闭即失效)。用户在发起第二次请求及后续请 求时,请求信息中会附带 JSESSIONID,服务器在接收到请求后, 调用对应的 Servlet 进行请求处理,同时根据 JSESSIONID 返回其 对应的 session 对象

1.获取session

HttpSession session=request.getSession()

如果请求中拥有JSESSIONID,则返回对应的session
如果请求中没有JSESSIONID,则创建新的session对象,并将其JSESSIONID作为从cookie数据存储在浏览器中
如果session对象失效了,也会重新创建一个session对象,并将JSESSIONID存储在浏览器内存中

JSESSIONID可以通过session.getID()查看

只要不关闭浏览器,并且 session 不失效的情况下,同一个用 户的任意请求在项目的任意Servlet中获取到的都是同一个session 对象

JSESSIONID存储在Cookie的临时存储空间中,浏览器关闭即失效。
且session的默认时效是30分钟。

设置session的存储时间
1.在项目中进行设置

session.setMaxInactiveInterval(int  time);    //time为秒

2.在tomcat的conf目录下的conf目录下的web.xml下进行修改
在这里插入图片描述
销毁时间为:在指定的时间内session对象没有被使用则销毁,如果使用了则重新计时

设置session强制失效

session.invalidate();

2.session存储数据和获取数据

存储数据

 session.setAttribute(String key,Object value);

获取数据

Object object=session.getAttribute(String key)   //返回类型为Object

session解决了一个用户的不同请求的数据共享问题,只要在JSEESIONID不失效和session的情况下,用户的任意请求在处理时都能获取到同一个session对象

作用域:
只要在JSEESIONID不失效和session的情况下,同一项目的任意位置都有效

session.getAttribute(key)强转某一对象时,先判断一下session.getAttribute(key)是否为null,之后再强转某一对象。

if(session.getAttribute("user")==null){
	response.sendRedirect("/login");
}
User user=(User)session.getAttribute("user");

ServletContext

Request 解决了一次请求内的数据共享问题,session 解决了 用户不同请求的数据共享问题,那ServletContext解决不同的用户的数据共享

ServletContext 对象由服务器进行创建,一个项目只有一个对 象。不管在项目的任意位置进行获取得到的都是同一个对象,那 么不同用户发起的请求获取到的也就是同一个对象了,该对象由 用户共同拥有

生命周期: 服务器启动到服务器关闭

获取ServletContext

方式一:
ServletContext servletContext=this.getServletContext()

方式二:
ServletContext servletContext=this.getServletConfig().getServletContext();

方式三
ServletContext servletContext=request.getSession().getServletContext()

使用ServletContext

使用ServletContext对象完成数据共享
1.存储数据

 servletContext.setAttribute(String key,Object value);

2.数据获取

Object o=servletContext.getAttribute(String key);

获取的数据不存在返回null

3.获取web.xml文件中的全局配置

web.xml中使用context-param标签存储全局配置

 <context-param>
        <param-name>key</param-name>
        <param-value>value</param-value>
  </context-param>


一组<context-param>存储一组键值对
servletContext.getInitParameter(String key)

如果数据不存在返回null

4.获取 webroot 下资源绝对路径

 String path=servletContext.getRealPath(String path);

如webroot下有css文件夹,css文件夹下有login.css文件
String path=servletContext.getRealPath("/css/login.css");

5.获取 webroot 下项目资源流对象

InpuStream is=servletContext.getResourceAsStream(String path)

此种方式只能获取项目根目录下的资源流对象,class文件的流对象需要使用类加载器获取

ServletConfig

使用ServletContext对象可以获取web.xml中的全局配置文件
每个Servlet也可以进行单独的配置,使用ServletConfig可以获取所属Servlet的配置信息

在这里插入图片描述
在Servlet中添加init-param的配置选项

获取ServletConfig

ServletConfig sc=this.getServletConfig();

使用ServletConfig

String value=sc.getInitParameter(String key);

ServletConfig 对象是 Servlet 的专属配置对象,每个 Servlet 都单独拥有一个 ServletConfig 对象,用来获取 web.xml 中的配置信 息

小结

不同的请求使用相同的数据,使用Cookie
不同的请求处理使用相同的数据,使用Session
Cookie存储在浏览器端,Session存储在服务器中,JSESSIONID存储在Cookie中
不同的用户使用相同的数据,使用ServletContext
不同的Servlet的数据,使用ServletConfig

Web.xml

存储项目相关的配置信息,保护 Servlet。解耦一些数据对程序 的依赖。

位置:

每个 Web 项目中
Tomcat 服务器中(在服务器目录 conf 目录中)

区别:

Web 项目下的 web.xml 文件为局部配置,针对本项目的位置。
Tomcat 下的 web.xml 文件为全局配置,配置公共信息。

内容(核心组件):

全局上下文配置(全局配置参数)
Servlet 配置
过滤器配置
监听器配置

加载顺序:

Web 容器会按 ServletContext -> context-param -> listener -> filter -> servlet 这个顺序加载组件,这些元素可配置在 web.xml 文件中的任意位置。

加载时机

服务器启动时

Server.xml

在tomact的conf 目录中
在这里插入图片描述

核心组件

<Server> 
   <Service>
      <Connector /> 
      <Connector />
      <Engine> 
           <Host>
                <Context />
           </Host> 
      </Engine> 
  </Service> 
</Server>

一个Server下面可以配多个Service
一个Service只能有一个Engine
Connector配置的是端口号
Host配置的是请求来了之后如何找寻请求的文件

热部署

<Context path ="/别名" reloadable ="true" docBase ="webroot的绝对路径" />

reloadable=true 每次改变都会自动加载 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值