servlet:是java Servlet的简称,称为小服务程序或服务连接器,用java编写的服务器程序,主要功能在于交互式地浏览的修改数据,生成动态web内容。狭义的servlet是指java语言实现的一个接口,广义的servlet是指任何实现了这个servlet接口的类,一般情况下,人们将servlet理解为后者,servlet运行于支持java的应用服务器中,从原理上讲,servlet可以响应任何类型的请求,但绝大多数情况下Servelt只是用来扩展基于HTTP协议的Web服务器,最早支持Servlet标准的是javaSoft的java Web Servlet,以后,一些其它的基于java的Web服务器开始支持标准的Servlet
简而言之:是一种请求响应的技术
servlet:生命周期
而Servlet的生命周期即阐述Servlet从产生到毁灭的整个过程在servlet产生到消亡的过程,有三个生命周期函数,初始化方法init(),处理客户请求的方法service(),终止方法destroy().
1.1 init():
在一个Servlet的生命周期中,init方法只会被执行一次,之后无论用户执行多少次请求,都不会在调用该方法。关于init(方法的执行时机,有两种方式可选,一般的是在服务器启动后第一个用户请求该Servlet时调用,你也可以设置该servlet在服务器启动后自动执行。) — 使用场景:init()负责预加载一些数据,这些数据将用于该Servlet的整个生命周期中
1.2 Service():
Service方法
当一个客户请求该Servlet时,实际的处理工作全部由service方法来完成,service方法用来处理客户端的请求,并生成格式化数据返回给客户端
1.3 destroy():
该方法在整个生命周期中,也是只会被调用一次,在Servlet对象被被销毁时调用,在servlet中我们可以做一些释放资源等操作,执行destory方法之后servlet对象,会等待jvm虚拟机的垃圾回收机制择时回收 备注:当修改servlet中内容的时候,就会触发destory()方法
getServletConfig()
在servlet初始化时,容器传递进来一个ServletConfig对象并保存在servlet实例中,该对象允许访问两项内容:初始化参数和
ServletContext对象,前者通常由容器在文件中指定,
允许在运行时向sevrlet传递有关调度信息,比如说getServletConfig().getInitParameter(“debug”)后者为servlet提供有关容器的信息。
此方法可以让servlet在任何时候获得该对象及配置信息。
getServletContext()
一个servlet可以使用getServletContext()方法得到web应用的servletContext
即而使用getServletContext的一些方法来获得一些值
比如说getServletContext().getRealPath("/")来获得系统绝对路径
getServletContext().getResource(“WEB-INF/web.xml”)来获得xml文件的内容
getServletContext()与getServletConfig()的区别?
1: getServletContext()取得的是 配置的参数
getServletConfig()取得的是 配置的参数
2: getServletConfig:表示servlet的配置信息,一个servlet对象对应一个servletconfig对象
getServletContext:表示servlet的全局配置信息,一个WebApplication只有一个ServletContext对象,该对象 被所有Servlet共用
java servletcontext和servletconfig作用的对象:
ServletConfig:表示servlet的配置信息,一个servlet对象对应一个servletconfig对象
ServletContext:表示servlet的全局配置信息,一个WebApplication只有一个ServletContext对象,该对象被所有Servlet共用
点击学习 ServletConfig、ServletContext_作用域对象https://www.cnblogs.com/aknife/p/10852092.html
servlet与JSP的关系
1.JSP执行之后的本质就是一个servlet
为什么既然有了JSP还要有Servlet呢?
答案:因为使用场景不同,JSP更多的偏重于页面的展示,而Servlet更多的是偏重于后台的处理程序
PS:HttpJspBase的父类是HttpServlet
2.JSP的执行效率/速度比Servlet慢
创建传参的方式:
从页面向后台传递参数:
非中文:String name=request.getParameter(String name ):
String password=request.getParameter(String password);
中文: 1.如果是以url传参的形式:例如<a href=<%=request.getContext()%>/user.do?name=“杨过”> </a>
此时再UserServlet中接受中文会出现乱码?
怎么修改呢:再tomcat(6.0)/conf/server.xml中大概67行连接端口的位置添加属性:URIEncoding=“utf-8”
PS: 在tomcat7.x和tomcat8.x开始对请求的url实现安全验证,所以在通过url传参的时候出现错误,
错误信息:Invalid character found in the erquest target(目标请求无效),为什么会出现这样的错误呢,是 因为在tomcat7.x和8.x的conf/catalina.propertise中199行写到允许为: |{},其实Tomcat7.x/8.x这样做的目 的是为了增加安全性,但是如果用户是通过rul传递中文参数的话,不修改可能会出现错误,己变修改了也有 可能不好使,那么有没有更好的方法呢,其实是有的 ,就是通过form表单提交或者更改为tomcat9.x
解决的方法:
1.换成form表单提交,
2.或者改用高版本的tomcat9.x
3.或者使用低版本的tomcat6.x且更改在tomcat (6.0) /conf/server.xml中大概67行连接端口的位置添 加属性:URIEncoding=“utf-8”
2.如果是以form表单提交中文的时候,也会在LoginServlet中出现乱码,那么怎么修改呢?
1.首先将当前的form表单的method设置为:method=“post”
2.在LoginServlet类中的service()方法中设定编码
request.setCharacterEncoding("utf-8");
responset.setCharacterEncoding("utf-8 ");
小结:
1.URL:例如</a href=“url”>URL 传参,js…,但是如果本次传递的参数中有中文不建议使用
2.通过form表达传参:可以传递中文,也可以传递其他的例如英文字符串,日期
从后台传递数据给页面:
1.先准备2行的假数据
List\<Map\<String,Object>> list=new ArrayList\<Map\<String,Object>>();
Map\<String,Object> map=new HashMap\<String,Object>();
map.put("sno","s001");
map.put("name","王大锤");
map.put("age","22");
list.add(map);
list.add(map2);
2.将数据存入到request对象中,且别名为list
request.setAttribute("list",list);
3.转向:将程序转向到查询展示页面
requst.getRequestDispatcher("/jsps/student/list_student.jsp").forward(request,response);
在JSP页面中获取路径的3种方法
1.<%=request.gatContextPath();%>
2.公告页面
1)创建一个/jsps/commons/commons.jsp,且里面的内容为<%String path=request.getContextPath();%>
2) 在需要用到的页面(login.jsp) 引入这个公共页面:<%@ include file="/jsps/commins/commins.jsp"%>
3)将原理的方式1那种写法修改为:<%=path%>
3.公共页面+<base>标签的方式:
1)将common.jap中的内容修改为:
<%
String path=request.getContextPath();
StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
2) 在需要用到的页面例如index.jsp中使用:<base href="<%=basePath%>"> 且是写在<head>标签中的
3)将原来写的<%=request.getContextPath();%>或者<%=path%>删掉
提示:第三种方法看似是最人性化的,但是IE浏览器对<dase>标签支持的不是很友好,故此在开发商业的项目的时候谨慎使用
第一种方法看似是最笨的,但是往往是最有效的,且用的也是比较多的
第二种方法可以看出在编写大型项目的时候才使用的