servlet详解

包: serlvet-api.jar tomcat>lib

Servlet:接口 javax.servlet.Servlet方法
String getServletInfo() 获取Servlet的信息(Servlet的作者,版本,版权相关)
ServletConfig getServletConfig(): 获取Servlet的配置信息对象
void init(ServletConfig config)
void service(ServletRequest req,ServletResponse resp);
void destroy();

ServletConfig:接口
String getServletName(); 获取当前Servlet的名字,<servlet=name>元素的文本内容
ServletContext getServleContext(); 获取当前Servlet上下文,其实表示当前应用对象
String getInitParameter(String parameName) 根据当前Servlet的指定的参数名获取初始化参数值
Enumeration getInitParameterNames() 获取当前Servlet的所有初始化参数的名字

ServletRequest:接口

HttpServletRequest:继承ServletRequest接口

常用方法:获取请求头
String getMethod():返回请求方式,如GET/POST
String getRequestURI():返回请求行中的资源名字部分,如/test/index.html
StringBuffer getRequestURL():返回浏览器地址栏中的所有信息
String getContextPath():获取当前项目的上下文路径(元素的path属性值)
String getQueryString(): //get提交url地址后面的参数字符串
String getRemoteAddr():获取发出请求的客户机的IP地址
String getHeader(Stirng name):返回指定名称的请求头的值
long getDateHeader(String name);
int getIntHeader(String name);

Enumeration getHeaderNames()
Enumeration getHeaders(String name)

获取请求体参数的方法:
String getParameter(String name):返回指定名字参数的值
String[] getParameterValues(String name):返回指定名字参数的多个参数值

Enumeration<Stirng> getParameterNames():返回所有参数名的Enumeration对象
Map<String,String[]> getParameterMap():返回所有的参数和值所组成的Map对象

setCharacterEncoding("UTF-8"):设置POST的编码
注意:先设置,在获取参数

Cookie[] getCookies():获取Cookie

域对象功能:
setAttribute(String name, Object o)
getAttribute(String name)
removeAttribute(String name)

转发:
forward(转发);
request.getRequestDispatcher("/list.jsp").forward(req,resp);

ServletResponse:接口

HttpServletResponse:接口继承ServletResponse

常用方法:
ServletOutputStream getOutputStream():获取字节输出流对象,用于文件下载
可以向response缓冲区中写入字节,在由Tomcat服务器将字节内容组成Http响应返回给浏览器。

PrintWriter getWriter():获取字符输出流对象,用于文字字符输出.
注意:每种都可以获取多次,但两种方式不可同时获取

设置输出数据的MIME类型(内容的类型)
setContentType("text/html"):设置输出的MIME类型,不能写错,写错则需要下载
setCharacterEncoding("UTF-8"):设置编码
setContentType("text/html;charset=utf-8") :设置MIME类型和编码
注意:先设置,再获取流

addCookie(Cookie cookie):将Cookie对象放入浏览器中


基本设置:
    设置响应行:
        setStatus(404);//设置状态,404,500,200
    设置响应头:
	add系列:  键一样,不存在覆盖
	   addHeader(String name,String value);
           addIntHeader(String name,int value);
	   addDateHeader(String name,long date);
	set系列:  键一样,存在覆盖
           setHeader(String name,String value);
	   setIntHeader(String name,int value);
	   setDateHeader(String name,long date);
    设置响应体:
        response.getWriter().write("hello!");
	response.getOutputStream().write();//用于文件下载

setHeader("refresh","5,url=http://www.baidu.com");//有时间间隔的重定向

Servlet映射细节:
1.一个Servlet程序(Web组件),可以配置多个,表示一个Servlet有多个资源名称
2.一个Servlet程序,可以配置多个
3.必须保持唯一性,而且必须使用/打头
4.Servlet的映射支持通配符映射(*:表示任意符号)
第一种: /任意的资源都可以访问该Servlet。
/system/
:请求的资源必须以/system/打头才可以访问
第二种: .扩展名,比如.do,请求的资源必须以.do结尾才可以访问Servlet
5.在映射Servlet的时候,元素的文本内容不能是default.
因为,在Tomcat中存在一个叫做default的Servlet,专门用于处理请求静态资源(html,css,js,图片等)
(项目的web.xml可以覆盖Tomcat的web.xml)
附加:
(
index.html
index.htm
index.jsp

默认访问资源
)

启动服务器时候就加载Servlet:

loadtime//loadtime值越小越优先启动

注解:
wel.xml 属性 metadata-complete=“true” 忽略注解
metadata-complete=“false” 不忽略,默认

XML:优点:XML配置很清晰,很直观,因为和Java代码相分离,维护性较高
    缺点:XML配置导致配置文件臃肿,开发效率较低
注解:优点:开发效率高,配置文件不臃肿,也方便快速定位
     缺点:和Java代码耦合在一起,维护性较低
  选择:
  	一般在企业中,现在注解使用的非常之多。
而做开发,XML文件用于做通用配置,个别配置使用注解来。


Cookie:
​ Cookie cookie = new Cookie(“cookiename”,“cookievalue”):
​ String getName():获取Cookie的name
​ String getValue():获取Cookie的value

{	注意:属性名和属性值不可以中文
	解决:new Cookie("cookiename",URLEncoder.encode(username,"UTF-8"));
		String value = URLDecoder.decode(cookie.getValue(),"UTF-8");
}

修改指定属性名的属性值
方式1:
	cookie.setValue("")
	resp.addCookie(cookie);
方式2:
	resp.addCookie(new Cookie("",""))
	利用同名cookie会覆盖原来cookie的值

Cookie分类:
	会话Cookie: 关闭浏览器后,销毁Cookie,默认
	持久化Cookie: Cookie可以保存指定时间段
			
setMaxAge(int time): time秒
	time等于零表示删除cookie
	小于零表示会话cookie
	大于零表示指定time后销毁cookie

二级域名共享Cookie,需要设置Cookie的domain和path
1.cookie.setPath("/"):在整个baidu.com中都能用
2.cookie.setDomain(".baidu.com"):指定域名格式
	(二级域名配置虚拟主机即可)

缺陷:
	1.浏览器可以查看Cookie,不安全
	2.Cookie存储中文比较麻烦(需要编码,解码)
	3.Cookie的value是String类型,一个Cookie只能存一个数据
	4.一个站点对Cookie有限制:
		Cookie大小限制在4KB内;
		一台服务器在一个客户端最多保存20个Cookie;
		一个浏览器最多可以保存300个Cookie;

Session:
1.创建和获取Session对象:
HttpSession session = request.getSession(true): 存在返回,不存在创建再返回
HttpSession session = request.getSession(false):存在返回,不存在返回null
HttpSession session = request.getSession(): 存在返回,不存在创建再返回

2.往Session中存储数据:
   session.setAttribute(String name,Objuect value):

3.从Session中取数据:
   Object value = session.getAttribute(String key):	

细节:
1:一般属性名要唯一,否则会覆盖,习惯XXX_IN_SESSION:
session.setAttribute(“USER_IN_SESSION”,“will”):
2:若需要把多个数据存放到Session中,就得调用setAttribute方法N次,
所以,一般把需要存储的数据封装成一个对象,然后再存储到Session中。
如果对象需要再网络中传输则需要实现java.io.Serializable接口,作序列化和反序列化

删除Session:
  1.删除Session中指定属性名的值:
     session.removeAttribute("keyname");
  2.销毁Session对象(删除所有属性名的值):
    session.invalidate();
 
Session的超时管理:
  session.setMaxInactiveInterval(int time) //超过time秒后,销毁Session 默认是30分钟,一般20分钟就销毁了
  web.xml:<session-config>
  	   <session-timeout>time</session-timeout>//超过time秒后,销毁Session `                  
       </session-config>


URL重写
Session是一种特殊的Cookie,浏览器禁用Cookie,Session也不能用,这时可以用URL重写
方式1:
out.println(“链接”);
方式2:
out.println("< href=’"+resp.encodeURL("/session/list")+"’>链接");
一般不用URL重写,判断Cookie是否打开,若没有打开建议打开

组件跳转:
req.getRequestDispatcher("/list.jsp").forward(req,resp);
resp.sendRedirect("/list");

方式1:	请求转发(forward)
	request.getRequestDispatcher(String path).forward(request,response);	
	path表示跳转目标的路径(资源路径)
			
    特点;
	1.浏览器地址栏不发生改变,依然是原来的地址,不是目标地址
	2.请求转发只发送一个请求
	   (请求转发跳转到目标路径将请求和响应一起发送,所以只有一个请求,并由目标路径决定最终响应内容)
	3.用的是同一个请求,所以共享数据
	4.最终响应给浏览器的是由目标路径的Servlet的响应决定
	5.请求转发不能跨域访问,只能跳转到当前应用中的资源
	6.请求转发可以访问WEB-INF目录中的资源
	
方式2:	URL重定向(redirect)
	resp.sendRedirect(String url);
	resp.sendRedirect("refresh","5,"+url) //定时跳转
	url表示目标资源地址
	
   特点:
	1.浏览器地址栏发生改变,从原地址变成目标地址
	   (相当于把目标地址复制到浏览器地址栏敲回车,所以是两个独立的请求和响应,但最终响应是目标路径的响应)
	2.URL重定向发了两次请求
	3.因为重定向是两次独立的请求,所以不共享请求中的数据
	4.最终响应由目标地址的Servlet决定
	5.URL重定向能跨域访问,可以访问其他应用中的资源
	6.URL重定向不能访问WEB-INF目录中的资源

方式3:	请求包含(include)
	在一页面中可以包含其他页面的内容
	在Servlet没有意义,在jsp中有意义
	request.getRequestDispatcher(String path).include(req,resp)
   特点:
	1.浏览器地址栏不发生改变,依然是原来的地址,不是目标地址
	2.请求转发只发送一个请求
	   (请求转发跳转到目标路径将请求和响应一起发送,所以只有一个请求,并由目标路径决定最终响应内容)
	3.用的是同一个请求,所以共享数据
	4.原Servlet和目标Servlet都作出响应(类似嵌套函数)


如何选择:
    必须使用请求转发(forward)
	1.如果需要共享请求中的数据
	2.如果需要访问WEB-INF中的资源
    必须使用URL重定向
	1.需要跨域访问
	2.避免表单重复提交
    其他情况。任意选

三大作用域对象:
目的:共享数据
HttpServletRequest: request
每一次请求都是一个新的request对象,如果在Web组件之间需要共享同一个请求中的数据,只能使用

HttpSession:			session
	每一次会话都是一个新的session对象,如果需要在一次会话中的多个请求之间需要共享数据,
	只能使用session 

ServletContext:			servletcontext(application)
	应用对象,Tomcat启动到Tomcat关闭,表示一个应用,在一个应用中有且只有一个application对象,
	作用于整个Web应用,可以实现多次会话之间的数据共享

如何共享数据:
	1.设置作用域中的共享数据:
	   作用域对象.setArrtibute(String name,Object value);
	2.获取作用域中的共享数据:
	   Object value = 作用域对象.getAttribute(String name);
	
	3.删除作用域中的指定的共享数据:
	   作用域对象.removeAttribute(String name);

	注意:在哪一个作用域中设置共享数据,就只能从该作用域中取出来数据.

ServletContext:接口
表示应用对象,(从Tomcat启动到Tomcat关闭之间,应用中有且只有
一个ServletContext对象,而且是在Tomcat启动时创建的,所以在JSP中把该对象
称之为application)

获取ServletContext对象:
	方式1:在Servlet类中:super.getServletContext();

	方式2:config.getServletContext();

	方式3:通过请求对象获取:request.getServletContext();

	方式4:通过session对象获取:request.getSession().getServletContext();
   注意:
   	无论哪种方式获取的都是同一个ServletContext对象

常用方法:
	1.String getRealPath(String path)根据一个资源的相对Web根的路径,获取它的绝对路径
	  String realPath = super.getServletContext().getRealPath("WEB-INF/in.html");
	2.String getContextPath();返回当前响应的上下文路径(<Context path="XXXX" />);

如果多个Web组件之间有相同的初始化参数配置,此时配置重复怎么解决?
	全局初始化参数

获取全局的初始化参数,只能使用:
	String getInitParameter(String name):获取指定名称的全局初始化参数
	Enumeration<String> getInitParameterNames():获取所有全局初始化参数的名字

注意:
	ServletConfig接口中的获取初始化参数的方法,只能获取当前Servlet自身的初始化参数,
	   不能获取全局初始化参数
	ServletContext接口中获取初始化参数的方法,只能获取全局的初始化参数,不能获取局部的初始化参数


wel.xml中设置全局初始化参数:
    <context-param>
	<param-name>name</param-name>
	<param-value>value</param-value>
    </context-param>

Java中的动态网页:
Servlet动态网页 = Java代码(主) + html代码(辅)
JSP动态网页 = Java代码(辅) + html代码(主)

Servlet不擅长界面输出,JSP擅长界面输出

Servlet擅长的事情:
	1.接受请求参数,封装成对象
2.调用业务方法,来处理请求
3.控制界面跳转,跳转到某一个JSP负责做界面输出操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值