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

		<!-- 注册servlet到项目中 -->
		<servlet>
		<!-- servlet-name给你要注册的servlet起一个名字,随便写.不能重复.  -->
			<servlet-name>AServlet</servlet-name>
			<!-- 完整类名 -->
			<servlet-class>cn.itcast.servlet.hello.AServlet</servlet-class>
			<load-on-startup>3</load-on-startup>
		</servlet>
		
		<!-- 分配路径给servlet  -->
		<servlet-mapping>
			<!-- 当前在为哪个servlet 分 配路径. -->
			<servlet-name>AServlet</servlet-name>
<!-- "/"相对于项目路径的.==> http://localhost:8080/Day07-servlet
访问该servlet的url==>http://localhost:8080/Day07-servlet/AServlet-->
			<url-pattern>/AServlet</url-pattern>
		</servlet-mapping>
(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 ==> 获得配置文件中 <servlet-name> 元素的内容
2>getInitParameter ==> 根据 <init-param>中的 <param-name> 获得 </param-value>
3>getInitParameterNames 返回所有<param-name> .
4>getServletContext(后面讲)

	String servletName =	getServletConfig().getServletName();
	/*
	 *  String getInitParameter(String name) 
   Enumeration getInitParameterNames()  :获取配置文件web.xml中的配置信息
	 */
	Enumeration<String> en = getServletConfig().getInitParameterNames();
	while(en.hasMoreElements()){
		String key = en.nextElement();
		String value = getServletConfig().getInitParameter(key);
		res.getWriter().print(key+"==>"+value+"<br/>");
	}
Web.xml配置一些键值对:
如配置数据库账号密码
		<servlet>
			<servlet-name>BServlet</servlet-name>
			<servlet-class>cn.itcast.servlet.servlet_config.BServlet</servlet-class>
			<init-param>
				<param-name>name</param-name>
				<param-value>tom</param-value>
			</init-param>
			<init-param>
				<param-name>password</param-name>
				<param-value>1234</param-value>
			</init-param>
		</servlet>

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";
	@Override
	public 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 {
	@Override
	public void doGet(HttpServletRequest req, HttpServletResponse resp) {
		
		System.out.println("您现在是使用GET方式访问!");
	}
	@Override
	public void doPost(HttpServletRequest req, HttpServletResponse resp) {
		
		System.out.println("您现在是使用POST方式访问!");
	}
	
}

(3)产生POST请求


  <body>
   	<form action="/Day07-servlet/DServlet" method="post" >
   		<input type="submit" value="提交" />
   	</form>
  </body>

快捷:ctrl+shift+t:查找方法

Ctrl +o查看当前类的方法

(4)以后创建servlet的方法:


7 Servlet中的其他细节


(1)Servlet线程安全问题

              因为在servlet运行期间只有一个servlet实例存在.可能会同时处理多个请求.

              那么我们在servlet中声明成员变量来存储用户数据是有线程安全问题的.

              我们应该如何解决呢?

                     1.实现SigleThreadModel  (不推荐了!)

                     2.使用局部变量保存用户数据.(推荐使用!)

(2)Servlet随着项目启动而创建

       启动的时候就创建实例

使用<load-on-startup>配置来实现.

              例如:

                     <servlet>

                            <servlet-name>AServlet</servlet-name>

                            <servlet-class>cn.itcast.servlet.hello.AServlet</servlet-class>

                            <load-on-startup>3</load-on-startup>

                     </servlet>

       填写一个整数,整数越小优先级越高.如果优先级一样,启动顺序按照配置顺序.

(3)关于Servlet路径配置问题详解

<url-pattern> 

                     路径匹配:

                            /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. <session-config>

                            <session-timeout>30</session-timeout>

                     </session-config>

              4.互联网中所有mime类型

              5.欢迎页面配置

8、ServletContext

1.servletContext 获得: 

servletConfig==> getServletContext
2.servletContext 的作用

              1>servletContext 封装了web.xml 中的配置

                     <context-param>

                            <param-name>name</param-name>

                            <param-value>jerry</param-value>

                     </context-param>

                     <context-param>

                            <param-name>password</param-name>

                            <param-value>1234</param-value>

                     </context-param>

                                   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 获得sc
			ServletContext 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 操作map
				sc.setAttribute("bag", "Calvin Klein");
				sc.setAttribute("car", "BMW");
				sc.setAttribute("passport", "HAWAII");
Bservlet
		//通过servletContext取值
			//1获得servletContext对象
		ServletContext sc = getServletContext();
			//2 操作map
			String bag = (String) sc.getAttribute("bag");
			
		//输出到客户端
		response.getWriter().print(bag);
		//不喜欢,扔掉(删除)
		sc.removeAttribute("bag");
		//遍历
		Enumeration<String> en = sc.getAttributeNames();
		System.out.println(sc);
		while(en.hasMoreElements()){
			String key = en.nextElement();
			 Object value =  sc.getAttribute(key);
			
			 System.out.println(key +"==>"+value);
			 
		}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值