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 每次改变都会自动加载