1、开发一个Servlet 步骤:
1)编写java类,继承HttpServlet类
2)重新doGet和doPost方法
3)Servlet程序交给tomcat服务器运行!!
3.1 servlet程序的class码拷贝到WEB-INF/classes目录
3.2 在web.xml文件中进行配置
@WebServlet(urlPatterns="/FirstServlet")
public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
int n=1;
//构造方法: 创建servlet对象的时候调用。默认情况下,第一次访问servlet的时候创建servlet对象 ,只调用1次。证明servlet对象在tomcat是单实例的。
public FirstServlet() {
super();
// TODO Auto-generated constructor stub
System.out.println("1.servlet对象第一次被创建");
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: "+n+"次").append(request.getContextPath());
System.out.println("2.完成doGet方法");
n++;
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
System.out.println("3.完成dopost方法");
}
// init方法: 创建完servlet对象的时候调用。只调用1次。
@Override
public void init() throws ServletException {
// TODO Auto-generated method stub
super.init();
System.out.println("4.init方法被调用");
}
//service方法: 每次发出请求时调用。调用n次。
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
// TODO Auto-generated method stub
super.service(arg0, arg1);
System.out.println("5.service法法被调用");
}
//destroy方法: 销毁servlet对象的时候调用。停止服务器或者重新部署
//web应用时销毁servlet对象。只调用1次。
@Override
public void destroy() {
// TODO Auto-generated method stub
super.destroy();
System.out.println("6.servlet对象被销毁");
}
}
2、常用的Servlet对象
HttpServletRequest 请求对象:获取请求信息
HttpServletResponse 响应对象: 设置响应对象
ServletConfig对象 servlet配置对象
ServletContext对象; servlet的上下文对象
HttpServletRequest对象: 请求对象。获取请求信息。
请求行:request.getMethod() 、request.getRequestURI/getRequestURL() 、request.getProtocol();
请求头: request.getHeader(“name”) 、 request.getHeaderNames()
实体内容: request.getInputStream()
获取参数数据:(GET或POST)
request.getParameter(“name”) 一个值的参数
request.getParameterValues(“name”); 多个值的参数
request.getParameterNames() 所有参数
HttpServletResponse对象: 响应对象。设置响应信息。
响应行: response.setStatus();
响应头: response.setHeader(“name”,“value”)
实体内容:
(PrintWriter) response.getWriter().writer(); 字符内容
(OutputStream)response.getOutputStream().writer(); 字节内容
3、ServletConfig对象
ServletConfig对象: 主要是用于加载servlet的初始化参数。在一个web应用可以存在多个ServletConfig对象(一个Servlet对应一个ServletConfig对象)
//实例化一个ServletConfig对象
ServletConfig config=this.getServletConfig();
ServletConfig config=request.getServletConfig();
ServletConfig的API:
java.lang.String getInitParameter(java.lang.String name) 根据参数名获取参数值
java.util.Enumeration getInitParameterNames() 获取所有参数
ServletContext getServletContext() 得到servlet上下文对象
java.lang.String getServletName() 得到servlet的名称
案例:
//通过getInitParameterNames获取initparam中的键值对
Enumeration<String> paramNames=config.getInitParameterNames();
while(paramNames.hasMoreElements()){
String paramName=paramNames.nextElement();
pw.append(paramName+":"+config.getInitParameter(paramName));
}
4、 ServletContext对象
ServletContext对象 ,叫做Servlet的上下文对象。表示一个当前的web应用环境。一个web应用中只有一个ServletContext对象。
实例化有关ServletContext对象
ServletContext context=this.getServletContext();
ServletContext context=ServletConfig.getServletContext();
java.lang.String getContextPath() --得到当前web应用的路径
java.lang.String getInitParameter(java.lang.String name) --得到web应用的初始化参数
java.util.Enumeration getInitParameterNames()
void setAttribute(java.lang.String name, java.lang.Object object) --域对象有关的方法
java.lang.Object getAttribute(java.lang.String name)
void removeAttribute(java.lang.String name)
RequestDispatcher getRequestDispatcher(java.lang.String path) --转发(类似于重定向)
java.lang.String getRealPath(java.lang.String path) --得到web应用的资源文件
java.io.InputStream getResourceAsStream(java.lang.String path)
java.lang.String getContextPath() 得到web应用路径
得到web应用的初始化参数(全局)
java.lang.String getInitParameter(java.lang.String name) --得到web应用的初始化参数
java.util.Enumeration getInitParameterNames()
web应用参数可以让当前web应用的所有servlet参数获取!!!
3、转发&重定向
//转发
request.getRequestDispatcher("/aa_IndexServlet").forward(request, response);
a)地址栏不会改变
b)转发只能转发到当前web应用内的资源
c)可以在转发过程中,可以把数据保存到request域对象中
//重定向
//response.sendRedirect(request.getContextPath()+"/aa_IndexServlet");
a)地址栏会改变,变成重定向到地址。
b)重定向可以跳转到当前web应用,或其他web应用,甚至是外部域名网站。
c)不能再重定向的过程,把数据保存到request中。
结论: 如果要使用request域对象进行数据共享,只能用转发技术!!!
5、Cooke技术:会话数据保存在浏览器客户端。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1)服务器创建cookie对象,把会话数据存储到cookie对象中。
Cookie cookie=new Cookie("name","kaihua");
/**将Cookie的数据发送到浏览器
*方法一、(通过响应头发送: set-cookie名称)!!!注意发送数据方式name=value,...
*方法二、response.addCookie(cookie1);
*/
/**response.setHeader("set-cookie1",cookie.getName()+
"="+cookie.getValue()+",email=@qq.com");*/
response.addCookie(cookie1);
/**
* 1)设置cookie的有效路径。默认情况:有效路径在当前web应用下。
*/
cookie.setPath(request.getContextPath());
cookie1.setPath("/WEB_Servlet_test");
/**
* 2)设置cookie的有效时间
* 正整数:表示cookie数据保存浏览器的缓存目录(硬盘中),数值表示保存的时间(秒)。
负整数:表示cookie数据保存浏览器的内存中。浏览器关闭cookie就丢失了!!
零:表示删除同名的cookie数据
*/
/*
cookie.setMaxAge(10);
cookie2.setMaxAge(0); //删除同名的cookie
*/
//服务器接收cookie里的数据
Cookie[] cookies=request.getCookies();
if(cookies!=null){
for(Cookie c:cookies){
System.out.println(c.getName()+"="+c.getValue());
}
}else{
System.out.println("cookie没有数据");
}
}
Cookie的细节
1)void setPath(java.lang.String uri) :设置cookie的有效访问路径。有效路径指的是cookie的有效路径保存在哪里,那么浏览器在有效路径下访问服务器时就会带着cookie信息,否则不带cookie信息。
2)void setMaxAge(int expiry) : 设置cookie的有效时间。
正整数:表示cookie数据保存浏览器的缓存目录(硬盘中),数值表示保存的时间。
负整数:表示cookie数据保存浏览器的内存中。浏览器关闭cookie就丢失了!!
零:表示删除同名的cookie数据
3)Cookie数据类型只能保存非中文字符串类型的。可以保存多个cookie,但是浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
6、 Session特点:会话数据保存在服务器端。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建或得到session对象
HttpSession session=request.getSession();
//把会话数据保存到session对象中
session.setAttribute("name", "kaihua");
//把JSESSIONID作为Cookie的值发送给浏览器保存
Cookie cookie=new Cookie("JSESSIONID",session.getId());
response.addCookie(cookie);
}
HttpSession类:用于保存会话数据
1)创建或得到session对象
HttpSession getSession()
HttpSession getSession(boolean create)
2)设置session对象
void setMaxInactiveInterval(int interval) : 设置session的有效时间
void invalidate() : 销毁session对象
java.lang.String getId() : 得到session编号
3)保存会话数据到session对象
void setAttribute(java.lang.String name, java.lang.Object value) : 保存数据
java.lang.Object getAttribute(java.lang.String name) : 获取数据
void removeAttribute(java.lang.String name) : 清除数据
7、引入
Cookie的局限:
1)Cookie只能存字符串类型。不能保存对象
2)只能存非中文。
3)1个Cookie的容量不超过4KB。
如果要保存非字符串,超过4kb内容,只能使用session技术!!!
//配置Servlet
@WebServlet(urlPatterns="/SecondServlet",
name="SecondServlet",
loadOnStartup =1,
initParams={
@WebInitParam(name="name",value="kaihua"),
@WebInitParam(name="pwb",value="1346464")
}
)

1593

被折叠的 条评论
为什么被折叠?



