javaWeb开发
2016-09-08 17:33
387 查看
转载: http://www.cnblogs.com/xdp-gacl/p/3729033.html
二、Servlet的运行过程
Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后:
①Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步。
②装载并创建该Servlet的一个实例对象。
③调用Servlet实例对象的init()方法。
④创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
⑤WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。
在eclipse中新建一个web project工程,eclipse会自动创建下图所示目录结构:
Servlet接口SUN公司定义了两个默认实现类,分别为:GenericServlet、HttpServlet。
HttpServlet指能够处理HTTP请求的servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。
HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法。因此,开发人员在编写Servlet时,通常只需要覆写doGet或doPost方法,而不要去覆写service方法。
4.2代码:
package HttpTest;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.text.MessageFormat;
import java.util.Properties;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sun.xml.internal.ws.client.RequestContext;
public class ServletDemo002 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = this.getServletContext();
//1. 获取整个web的初始化参数
/* String contextInit = context.getInitParameter("url");
String nameInit = context.getInitParameter("name");
response.getWriter().println("contextInit:" + contextInit + "nameInit:" + nameInit);*/
//2.用servletcontent 实现请求转发
/*String data="<h1><font color='red'>abbdhd</h1>" ;
response.getOutputStream().write(data.getBytes());
ServletContext contexts=this.getServletContext(); //获取servlet对象
RequestDispatcher rd=context.getRequestDispatcher("/HttpTest/ServletTest001"); //获取请求转发对象
rd.forward(request, response); //实现请请求转发*/
//3.使用servletContext读取资源文件
/* response.setContentType("text/html;charset=UTF-8"); //控制浏览器使用utf-8解读,以防出现乱码
response.setHeader("content-type","text/html;charset=UTF-8");
readSrcDirPropCfgFile(response);//读取src目录下的的db1.properties配置文件
*/
//4.使用类装载器读取资源文件,注意:文件不能过大,否则会导致内存溢出
/*response.setHeader("content-type","text/html;charset=UTF-8");
test1(response);*/
//5.在客户端缓存Servlet输出
//对于不经常访问的数据,servlet为其设置合理的缓存时间,以避免浏览器频繁的发送请求,
String data="今天是16年的中秋节" ;
response.setDateHeader("expires", System.currentTimeMillis()+24*3600*1000);
response.getOutputStream().write(data.getBytes());
}
private void readSrcDirPropCfgFile(HttpServletResponse response){
//获取文件的绝对路径
//String path=this.getServletContext().getRealPath("/WEB-INF/classes/db1.properties");
InputStream in =null;
try {
// in = new FileInputStream(path);
in=this.getServletContext().getResourceAsStream("/WEB-INF/classes/db1.properties");
//in=this.getServletContext().getResourceAsStream("/db1.properties"); //“/”代表根目录
Properties prop=new Properties();
prop.load(in);
String driver=prop.getProperty("driver");
String url=prop.getProperty("url");
String username=prop.getProperty("username");
String password=prop.getProperty("password");
response.getWriter().println("读取src目录下的db1文件");
response.getWriter().println(MessageFormat.format("driver={0},url={1},username={2},password={3}", driver,url, username, password));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void test1(HttpServletResponse response) throws IOException{
//获取到装载当前类的类装载器
ClassLoader loader=ServletDemo002.class.getClassLoader();
//用类装载器读取src目录下的db1文件
InputStream is=loader.getResourceAsStream("db1.properties");
Properties p=new Properties();
p.load(is);
String driver=p.getProperty("driver");
String url=p.getProperty("url");
String username=p.getProperty("username");
String password=p.getProperty("username");
response.getWriter().println("通过类加载读取配置文件:");
response.getWriter().println(MessageFormat.format("driver={0},url={1},username={2},password={3}", driver,url, username, password));
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
注:想请求重定向,如登录成功后跳转到另一个页面 使用:
【1】response.sendRedirect("/JavaWeb_HttpServletResponse_Study_20140615/index.jsp"); 但是这个地址不够灵活,所以可以使用:
response.sendRedirect(request.getContextPath()+"index.jsp"); //替代了项目名称
获取服务端文件路径:this.getServletContext().getrRealPath("/download/1.JPG")
一般最好在路径前加上“/“,对于服务端代表当前web工程,对于客户端则代表webapps目录
【2】在服务端forward到其他页面:
客户端请求某个web资源,服务器跳转到另外一个web资源,这个forward也是给服务器用的,this.getServletContext().getRequestDispatcher("/index.jsp").forward(request,
response);
【3】使用include指令或者<jsp:include>标签引入页面
<a
href="${pageContext.request.contextPath}/index.jsp">跳转到首页</a>
这这种是给浏览器用的路径
【5】在form表单中的使用:
二、Servlet的运行过程
Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后:
①Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步。
②装载并创建该Servlet的一个实例对象。
③调用Servlet实例对象的init()方法。
④创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
⑤WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。
三、Servlet调用图
四、在Eclipse中开发Servlet
在eclipse中新建一个web project工程,eclipse会自动创建下图所示目录结构:
4.1、Servlet接口实现类
Servlet接口SUN公司定义了两个默认实现类,分别为:GenericServlet、HttpServlet。HttpServlet指能够处理HTTP请求的servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。
HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法。因此,开发人员在编写Servlet时,通常只需要覆写doGet或doPost方法,而不要去覆写service方法。
4.2代码:
package HttpTest;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.text.MessageFormat;
import java.util.Properties;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sun.xml.internal.ws.client.RequestContext;
public class ServletDemo002 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = this.getServletContext();
//1. 获取整个web的初始化参数
/* String contextInit = context.getInitParameter("url");
String nameInit = context.getInitParameter("name");
response.getWriter().println("contextInit:" + contextInit + "nameInit:" + nameInit);*/
//2.用servletcontent 实现请求转发
/*String data="<h1><font color='red'>abbdhd</h1>" ;
response.getOutputStream().write(data.getBytes());
ServletContext contexts=this.getServletContext(); //获取servlet对象
RequestDispatcher rd=context.getRequestDispatcher("/HttpTest/ServletTest001"); //获取请求转发对象
rd.forward(request, response); //实现请请求转发*/
//3.使用servletContext读取资源文件
/* response.setContentType("text/html;charset=UTF-8"); //控制浏览器使用utf-8解读,以防出现乱码
response.setHeader("content-type","text/html;charset=UTF-8");
readSrcDirPropCfgFile(response);//读取src目录下的的db1.properties配置文件
*/
//4.使用类装载器读取资源文件,注意:文件不能过大,否则会导致内存溢出
/*response.setHeader("content-type","text/html;charset=UTF-8");
test1(response);*/
//5.在客户端缓存Servlet输出
//对于不经常访问的数据,servlet为其设置合理的缓存时间,以避免浏览器频繁的发送请求,
String data="今天是16年的中秋节" ;
response.setDateHeader("expires", System.currentTimeMillis()+24*3600*1000);
response.getOutputStream().write(data.getBytes());
}
private void readSrcDirPropCfgFile(HttpServletResponse response){
//获取文件的绝对路径
//String path=this.getServletContext().getRealPath("/WEB-INF/classes/db1.properties");
InputStream in =null;
try {
// in = new FileInputStream(path);
in=this.getServletContext().getResourceAsStream("/WEB-INF/classes/db1.properties");
//in=this.getServletContext().getResourceAsStream("/db1.properties"); //“/”代表根目录
Properties prop=new Properties();
prop.load(in);
String driver=prop.getProperty("driver");
String url=prop.getProperty("url");
String username=prop.getProperty("username");
String password=prop.getProperty("password");
response.getWriter().println("读取src目录下的db1文件");
response.getWriter().println(MessageFormat.format("driver={0},url={1},username={2},password={3}", driver,url, username, password));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void test1(HttpServletResponse response) throws IOException{
//获取到装载当前类的类装载器
ClassLoader loader=ServletDemo002.class.getClassLoader();
//用类装载器读取src目录下的db1文件
InputStream is=loader.getResourceAsStream("db1.properties");
Properties p=new Properties();
p.load(is);
String driver=p.getProperty("driver");
String url=p.getProperty("url");
String username=p.getProperty("username");
String password=p.getProperty("username");
response.getWriter().println("通过类加载读取配置文件:");
response.getWriter().println(MessageFormat.format("driver={0},url={1},username={2},password={3}", driver,url, username, password));
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
注:想请求重定向,如登录成功后跳转到另一个页面 使用:
【1】response.sendRedirect("/JavaWeb_HttpServletResponse_Study_20140615/index.jsp"); 但是这个地址不够灵活,所以可以使用:
response.sendRedirect(request.getContextPath()+"index.jsp"); //替代了项目名称
获取服务端文件路径:this.getServletContext().getrRealPath("/download/1.JPG")
一般最好在路径前加上“/“,对于服务端代表当前web工程,对于客户端则代表webapps目录
【2】在服务端forward到其他页面:
客户端请求某个web资源,服务器跳转到另外一个web资源,这个forward也是给服务器用的,this.getServletContext().getRequestDispatcher("/index.jsp").forward(request,
response);
【3】使用include指令或者<jsp:include>标签引入页面
<%@include file="/jspfragments/head.jspf" %> 或者
<jsp:include page="/jspfragments/demo.jsp" />
【4】
<a
href="${pageContext.request.contextPath}/index.jsp">跳转到首页</a>
这这种是给浏览器用的路径
【5】在form表单中的使用:
1 <form action="${pageContext.request.contextPath}/servlet/CheckServlet" method="post"> 2 <input type="submit" value="提交"> 3 </form>
${pageContext.request.contextPath}等同于request.getContextPath()来获取项目的绝对路径
等同与
<form action="<%=request.getContextPath()%>/servlet/CheckServlet" method="post">
2 <input type="submit" value="提交"> 3 </form>
相关文章推荐
- JavaWEB开发中用到DWR时的配置、调用、Form提交的方法
- 基于JavaWeb项目开发的深入调研
- javaweb网上书店开发之异常处理----org.apache.catalina.core.StandardWrapperValve invoke
- JavaWeb开发第8章标准标签库(JSTL)之三国际化标签
- javaWeb_01-web开发相关概念与常见web服务器
- JavaWeb开发第8章标准标签库(JSTL)之四 JSTL函数
- javaweb开发网上书店 ----封面预览
- JavaWEB开发的相关知识
- JAVAWEB开发-国际化
- 定制CheckStyle (javaWeb软个开发规则)
- JavaWeb开发,配置tomcat数据库连接池的问题,解决以及总结(三)
- 在linux上搭建javaweb的开发环境
- JavaWeb开发中对于XSS跨站脚本攻击的防护措施
- javaweb开发的路径问题
- JavaWeb物流管理项目开发(JSP、Servlet、JDBC):1、项目背景介
- JavaWeb物流管理项目开发(JSP、Servlet、JDBC):5、搭建项目架
- javaweb开发 核心类!!!SHS
- JAVAWeb开发之采用DOM技书解析xml文档和进行CRUD操作
- javaWEB开发中get方式请求的乱码问题解决
- javaweb_04,05-Servlet开发的一些重要细节