1.管理互联网资源(HTML 图片 视频 数据)
2.被动等待用户的请求request(方法)
3.将用户请求的内容,返回(响应 response)给客户端(用户)
url:http://ip:port/项目名/资源路径
rui:/项目名/资源路径 本tomcat内部资源路径
应用:form a link img
url-pattern:/资源路径 本项目内部资源
概念:一段Java程序,可以运行在tomcat端
语法:Servlet标准(接口)JavaEE标准(servlet-api.jar)
1.接口 interface Servlet{ inint(){servlet对象创建的自动调用} destroy(){servlet对象销毁的自动调用} // 用户访问tomcat服务器的该程序,调用service方法 service(){ //用户请求后,执行的代码 } 2.JavaEE提供类: HttpServlet 实现了Servlet接口 3.自定义tomcat运行代码 public class MyServlet extends HttpServlet{ public void service(){ //覆盖servlet的service方法 } }
核心:
WEB-INF\classes :编译后的servlet的class文件(带包)
web.xml:
<servlet> <servlet-name>firstServlet</servlet-name> <servlet-class>com.lhl.demo1.FirstServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>firstServlet</servlet-name> <url-pattern>/firstDate</url-pattern>
异常
1.405
Method Not Allowed
原因:方法调用错误
解决:1.方法名是否错误 2.service方法内,不能调用父类方法
2.访问servlet变成下载
原因:响应类型设置有问题
resp.setContentType("text/html;charset=UTF-8");
3.servlet修改后,没有变化
原因:servlet代码修改,tomcat需要重启
4.500错误
1.classNotFundException:web.xml的servlet的全类名写错
2.服务端java代码运行异常
5.404错误
原因:浏览器访问地址 不存在 地址写错(浏览器地址栏,url-pattern不一致) tomcat启动失败
概念:servlet创建时机和活跃使用时机、销毁时机
interface Servlet{ //对象创建执行 init(){} //浏览器请求到servlet,提供服务的运行方法 service(){} //对象销毁执行 destroy(){}
第一个浏览器访问servlet,对象会被创建
一个Servlet类只会创建一个servlet对象,且提供所有用户访问
浏览器每次访问都会调用service方法
tomcat关闭,销毁servlet对象
Servlet对象只有一个单实例,面向多线程访问,线程不安全,要求不要添加数据属性
tomcat 1.获得url的项目名,从本tomcat下的webapps下找到对应文件 2.根据url中servlet的url-pattern,从web.xml找到servlet-name,找到servlet-class被访问的servlet全类名 3.Class<> cl = Class.forName(“Servlet全类名”)//获得servlet的类对象 4.Servlet servlet = (Servlet)cl.newInstance();//创建出了类的对象 5.tomcat先调用servlet.init()方法 6.servelt.service(res,resp)调用servlet的service方法 7.服务器将响应结果返回给浏览器 8.浏览器发出第二次请求 9.tomcat会直接根据url-pattern,找到servlet对象,调用servlet.service方法
概念:浏览器请求servlet携带的数据叫做请求参数
Servlet接收请求参数:
浏览器请求Servlet的方式
请求参数乱码问题
Post提交乱码
解决:req.setCharacterEncoding("UTF-8");
注意:设置编码,在接收请求参数之前设置。
Get提交乱码
修改tomcat的conf/server.xml中<connector/> 加上URIEncoding="UTF-8"
请求转发
作用:多个servlet配合完成一个功能
核心:
RequestDispatcher rdp = request.getRequestDispatcher("转发后下一个servlet的url-pattern"); //获得转发器 rdp.forward(req,resp); //foward转发,调用转发动作
概念:JavaEE提供的存储数据(命名属性)的空间
命名属性:名字--值
生命周期:一次请求过程(请求转发的servlet正好处于一次请求过程)
存: request.setAttribute("名字",值/数据/对象/xxx); 取: request.getAttribute("名字");
核心:
1.服务器外部跳转
2.通知浏览器,自动请求下一个要跳转的页面或者Servlet(不需要用户操作)
3.重定向连接的servlet或者资源,处于两个不同的请求过程
4.请求重定向后的页面和浏览器的地址一致
resp.sendRedirect("/项目名/资源路径url-pattern");
http协议:无状协议,协议本身不会记录任何信息,两次信息传输之间没有任何关系
应用:浏览器记录,登录验证,验证码,购物车(阉割版)
解释:浏览器和服务器之间,多次交互依然保存数据(状态)的一种机制
概念:服务器保存在浏览器上的一小段字符串(key=value)
工作机制:
编码:
1.创建 Cookie cookie = new cookie("key","value"); 2.将cookie存入浏览器 response.addCookie(cookie);//将cookie随着响应返回给浏览器 3.设置生命周期 cookie.setMaxAge(秒); 4.获得浏览器请求携带的cookie信息 Cookie[] cs = response.getCookies();
cs[0].getName();//cookie的key
cs[0].getValue();//cookie的value
Cookie的特点
1.存在浏览器上
优点:分担服务器压力,不会占用服务器资源
缺点:数据不太安全
2.cookie只能保存字符串,不能保存中文
3.cookie生命周期
设置0等于删除cookie
设置-1等于浏览器关闭,cookie丢失
模式为浏览器关闭,cookie丢失
4.cookie和浏览器一一对应
工作机制:服务器为每个浏览器分配一个一一对应的存储空间
特点:
1.存放在服务器
2.每个浏览器和session一一对应
3.HttpSession生命周期夸多次请求依然存在
API:
1.属性 id
2.获得session
request.getSession();
第一次访问会创建seesion对象
第2到 n次访问会获得原有的session对象给你
作用:
作用域,存储命名属性
存:session.setAttribute("name",值); 取:seesion.getAttribute("name"); 移除:session.removeAttribute("name");
应用(强制登录/登录验证):
某些资源(HTML、Servlet)的访问需要用户登录后才能访问,否则强制去登录页面
思路 :web项目服务器记住用户
Session失效:
相同点:
不同点:
cookie
session
机制:
浏览器第一次请求服务器web项目,会为该浏览器创建一个session对象,并获得session的id,id以cookie的形式写回到浏览器。以后每次浏览器请求服务器会自动携带cookie(JesessionId)信息,tomact通过获得cookie中名字为jesessionid的cookie的value值和内部所有的session对象匹配,找到对应的session对该浏览器使用
内部代码实现(局部) 1.浏览器第一次请求服务器 HttpSession session = new XxxxSession(); String id = session.getId(); //将session保存在服务器内存中(集合) Map<String,HttpSession> map = new ConcurrentHasMap<String,HttpSession>(); Cookie ck = new Cookie("jsessionid",id); resp.addCookie(ck); 2.浏览器第二次(以后)请求服务器 Cookie[] cks = req.getCookies(); for(Cookie c:cks){ if(c.getName().equals("jsessionid")){ String sessionId = c.getValue(); //根据sessionid找到对应的session对象 HttpSession session = map.get(sessionId); } }
用户禁用Cookie
对所有超链接+表单等一切请求服务器的url路径,全部进行url重写
String 重写后的url = resp.encodeUrl(原url地址)
概念:Servlet中提供的技术,可以过滤浏览器发出的请求,并且决定放行请求还是中断请求
编码:
1.自定义一个java类,实现Filter接口 public class EncodingFilter implements Filter{ //请求经过filter要执行的代码 doFilter(FilterChain chain){ //放行之前 chain,doFilter(req,resp);//放行代码 //响应回来的代码 } } 2.在web.xml中注册信息 <filter> <filter-name></filter-name> <filter-class></filter-class> </filter> <filter-mapping> <filter-name></filter-name> <url-pattern>过滤请求的servlet或者html的url-pattern</url-pattern> </filter-mapping>
Filter的url-pattern写法:
作用域:一个web应用只有一个ServletContext对象
1.获得ServletContext ServletContext ctx = session.getServletContext(); 2.存 ctx.setAttribute("name",值); 3.取 ctx.getAttribut("name"); 4.移除 ctx.removeAttribute("name");
常用API
1.全局参数
web.xml启动加载完毕会将信息存入servletContext
1.在web.xml书写常亮配置 <context-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </context-param> 2.从servletContext中获得常亮配置
HttpServletRequest reqs = (HttpServletRequest) req;
ServletContext ctx = reqs.getSession().getServletContext();
String value = ctx.getInitParameter("encoding");
req.setCharacterEncoding(value);
resp.setCharacterEncoding(value);
2.web应用内流的相对路径
String 真实路径 = ctx.getRealPath("/项目名下的相对路径");
3.动态获取项目名
String ctxtPath = request.getContextPath();
ServletContextListener:监听ServletContext对象的创建和销毁
HttpSessionListener:监听HttpSession对象创建和销毁
ServletRequestListener:监听ServletRequest对象创建和销毁
原文:https://www.cnblogs.com/lhl0131/p/13060015.html