javaEE之servlet总结
1、servlet简介
servlet是我们学习的第一个动态资源.动态的生成页面。
2、如何实现一个servlet项目
1>实现servlet接口即可.
2>继承javax.servlet.GenericServlet(优化servlet)
3>继承javax.servlet.http.HttpServlet(再次优化servlet)
(1)myeclipse新建web项目
(2)创建类
创建方法1,实现servlet接口
Ctrl+1添加未实现方法
// init 是在第一次请求AServlet时调用.==> servlet实例的创建是在第一次访问的时候,servlet在多次访问时,发现只调用了1次init方法.在多次访问,只创建了一个实例
public void init(ServletConfig arg0) throws ServletException // 当客服端请求的时候调用service , 参数1 request 对象封装了 请求信息.参数2response 中填入信息生成响应.
public void service(ServletRequest arg0, ServletResponse arg1)// 在服务器将要关闭时,会销毁内存中的servlet实例. 在销毁之前会调用destroy方法.
public void destroy()
右键 stop server//这个方法,没有用
public String getServletInfo() //获得servletconfig对象.
public ServletConfig getServletConfig()
(3)修改web.xml
AServlet cn.itcast.servlet.hello.AServlet 3 AServlet
/AServlet (4)启动server,部署项目
http://localhost:8080/Day07-servlet/AServlet
3、servlet生命周期
生命周期指的是 必须要经历的过程.
对于servlet来讲,有3个生命周期方法.
1> 出生 ==> init方法.在构造方法调用之后 调用.
2> 使命 ==> service方法 ,当请求发来时,处理请求使用.
3> 销毁 ==> destory方法, 当服务器关闭时,会销毁servlet,在销毁之前调用该方法释放资源.
4、请求servlet请求流程图
5、ServletConfig对象(JAVA_EE_api_中英文对照版.chm)
封装了servlet在web.xml中的配置.方法:
1>getServletName ==> 获得配置文件中
2>getInitParameter ==> 根据
3>getInitParameterNames 返回所有
4>getServletContext(后面讲)
String servletName = getServletConfig().getServletName();/** String getInitParameter(String name) Enumeration getInitParameterNames() :获取配置文件web.xml中的配置信息*/Enumeration en = getServletConfig().getInitParameterNames();while(en.hasMoreElements()){String key = en.nextElement();String value = getServletConfig().getInitParameter(key);res.getWriter().print(key+"==>"+value+"
");}
Web.xml配置一些键值对:
如配置数据库账号密码BServlet cn.itcast.servlet.servlet_config.BServlet name tom password 1234
6、servlet优化
(1)GenericServlet
将Servlet接口中的方法进行优化,
以后的Servlet直接继承这个GenericServlet类,就不需要做一些重复性的工作了。其实就是封装了Servlet接口而已。这样我们可以很方便的调用方法。
(2)HTTPServlet更好的处理GET 和POST请求。一个Servlet多用
public abstract class MyHttpServlet extends GenericServlet {public static final String Method_GET = "GET";public static final String Method_POST = "POST";@Overridepublic void service(ServletRequest req, ServletResponse resp)throws ServletException, IOException {//优化1: 我们开发项目都是基于HTTP协议的, 而且服务器在service方法中传给我的ServletRequest对象,实际上就是HttpServletRequest对象//所以我们把 request和 response强转成HTTP的.HttpServletRequest request = null;HttpServletResponse response = null;try {request = (HttpServletRequest) req;response = (HttpServletResponse) resp;} catch (Exception e) {}service(request,response);}public void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {//优化2: 我想根据请求方式的不同,做不同的事情//1获得客户端的请求方式String method = req.getMethod();//GET/POST//2 根据请求方式不同,调用不同的方法if(method.equals(Method_GET)){doGet(req,resp);}else if(method.equals(Method_POST)){doPost(req,resp);}}public void doPost(HttpServletRequest req, HttpServletResponse resp) {}public void doGet(HttpServletRequest req, HttpServletResponse resp) {}
}
public class DServlet extends MyHttpServlet {@Overridepublic void doGet(HttpServletRequest req, HttpServletResponse resp) {System.out.println("您现在是使用GET方式访问!");}@Overridepublic void doPost(HttpServletRequest req, HttpServletResponse resp) {System.out.println("您现在是使用POST方式访问!");}}
(3)产生POST请求
快捷:ctrl+shift+t:查找方法
Ctrl +o查看当前类的方法
(4)以后创建servlet的方法:
7 Servlet中的其他细节
(1)Servlet线程安全问题
因为在servlet运行期间只有一个servlet实例存在.可能会同时处理多个请求.
那么我们在servlet中声明成员变量来存储用户数据是有线程安全问题的.
我们应该如何解决呢?
1.实现SigleThreadModel (不推荐了!)
2.使用局部变量保存用户数据.(推荐使用!)
(2)Servlet随着项目启动而创建
启动的时候就创建实例
使用
例如:
填写一个整数,整数越小优先级越高.如果优先级一样,启动顺序按照配置顺序.
(3)关于Servlet路径配置问题详解
路径匹配:
/AServlet http://localhost:8080/Day07-servlet/AServlet
/ABC/AServlet http://localhost:8080/Day07-servlet/ABC/AServlet
/ABC/ABC/AServlet http://localhost:8080/Day07-servlet/ABC/ABC/AServlet
/ABC/ABC/* http://localhost:8080/Day07-servlet/ABC/ABC/oasdojasdjioasd
/* http://localhost:8080/Day07-servlet/asdiojoiajsidojoasd
/相当于 /*
后缀名匹配:
*.do==> struts
*.action==> struts2
*.html==>
注意:1.关于路径,配置的路径匹配范围越大优先级越低.
2.两种匹配模式不能混用. 例如错误的例子: /*.do
(4)关于tomcat的目录下的web.xml配置1.default servlet的配置
2.jsp servlet的配置
3.
4.互联网中所有mime类型
5.欢迎页面配置
8、ServletContext
1.servletContext 获得:
servletConfig==> getServletContext2.servletContext 的作用
1>servletContext 封装了web.xml 中的配置
getInitParameterNames(); ==> 获得所有键
getInitParameter(key); ==> 根据键获得对应的值
2>servlet技术中3大域对象之一.
ServletContext对应着Application(应用)域.利用了一个项目中只有一个ServletContext实例的特点.在servletContext中放置了一个map用作数据通信.
这个Map就是所谓域.
关于域的操作,有4个.
放入键值对 setAttribute(key,value)
通过键取值 getAttribute(key)
通过键删除 removeAttribute(key)
遍历所有键 getAttributeNames()
application==> servletContext
session==>
request==>
3>获得项目中资源.
所有servletContext中关于路径的获得,相对路径都是相对的 WebRoot(项目根)下
getRealPath ==> 通过相对路径获得绝对路径
getResourceAsStream==> 根据相对路径获得指定资源流
3.servlet技术中对象的范围
servlet==> 项目启动期间一个servlet只有一个servlet实例
request==> 项目启动期间,request对象的数量,要看当前有多少个请求正在处理.
response==> 同上.
servletConfig ==> 一个servlet实例对应一个servletConfig对象
servletContext==> 整个项目中,永远只有一个servletContext实例存在.
servletContext来获取项目资源:
//其实 javaee 在servletContext 中准备了一些获得资源的相关方法//1 获得scServletContext sc = getServletContext();//2 getResourceAsStream ==> 填写相对路径即可, 相对的是webRoot下InputStream is = sc.getResourceAsStream("/WEB-INF/students.xml");System.out.println(is);String path = sc.getRealPath("/WEB-INF/students.xml");System.out.println(path);Set set = sc.getResourcePaths("/");for(Object obj : set){System.out.println(obj);}String path2= sc.getResource("/WEB-INF/students.xml").getPath();System.out.println(path2);//获得lib目录下的资源getServletContext().getRealPath("/WEB-INF/lib/students.xml");//获得src下的资源==> 获得classes目录下的资源getServletContext().getRealPath("/WEB-INF/classes/students.xml");//获得cn.itcast.servlet.servlet_context包下的资源getServletContext().getRealPath("/WEB-INF/classes/cn/itcast/servlet/servlet_context/students.xml");//---------------------------------------------------------------------------//如果获得的是包下的,那么太麻烦了.//一:使用getClass().getResourceAsStream方法,相对路径分为两种情况//1: 加"/" ==> 相对的是classes目录//2: 不加"/" ==> 相对的是本类当前目录InputStream is = this.getClass().getResourceAsStream("students.xml");System.out.println(is);//二:使用this.getClass().getClassLoader().getResourceAsStream("");获得//只有一个相对路径 ==> 就是相对于 classes目录InputStream is2 = this.getClass().getClassLoader().getResourceAsStream("students.xml");System.out.println(is2);//注意: 使用类和类加载器加载资源文件时//1 jvm运行期间只加载一次. 但是使用下面的代码可以解决这个问题.String path = this.getClass().getClassLoader().getResource("students.xml").getPath();File file = new File(path.substring(1, path.length()));System.out.println(path);//2 getClassLoader()原本是用来加载.class文件的, 所以缓存设计的很小.不要用他加载一些别较大的资源.
三大域对象
1.request
request是表示一个请求,只要发出一个请求就会创建一个request,它的作用域:仅在当前请求中有效。
用处:常用于服务器间同一请求不同页面之间的参数传递,常应用于表单的控件值传递。
常用方法:
request.setAttribute();
request.getAttribute();
request.removeAttribute();
request.getParameter().
2. session
服务器会为每个会话创建一个session对象,所以session中的数据可供当前会话中所有servlet共享。
会话:用户打开浏览器会话开始,直到关闭浏览器会话才会结束。一次会话期间只会创建一个session对象。
用处:常用于web开发中的登陆验证界面(当用户登录成功后浏览器分配其一个session键值对)。
方法:
session.setAttribute();
session.getAttribute();
session.removeAttribute();
获得session对象方法:
1. 在Servlet中:HttpSession session = request.getSession();
2. 由于session属于jsp九大内置对象之一,是可以直接使用的。例如:<%session.serAttribute("name","admin")%>。
备注: session是服务器端对象,保存在服务器端。并且服务器可以将创建session后产生的sessionid通过一个cookie返回给客户端,以便下次验证。(session底层依赖于cookie)
3. Application(ServletContext)
作用范围:所有的用户都可以取得此信息,此信息在整个服务器上被保留。Application属性范围值,只要设置一次,则所有的网页窗口都可以取得数据。ServletContext在服务器启动时创建,在服务器关闭时销毁,一个JavaWeb应用只创建一个ServletContext对象。
多个servlet通过ServletContext进行通讯。
Aservlet
//使用servletContext完成通信//1获得servletContext对象ServletContext sc = getServletContext();//2 操作mapsc.setAttribute("bag", "Calvin Klein");sc.setAttribute("car", "BMW");sc.setAttribute("passport", "HAWAII");
Bservlet
//通过servletContext取值//1获得servletContext对象ServletContext sc = getServletContext();//2 操作mapString bag = (String) sc.getAttribute("bag");//输出到客户端response.getWriter().print(bag);//不喜欢,扔掉(删除)sc.removeAttribute("bag");//遍历Enumeration en = sc.getAttributeNames();System.out.println(sc);while(en.hasMoreElements()){String key = en.nextElement();Object value = sc.getAttribute(key);System.out.println(key +"==>"+value);}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
