一、Servlet简介
Servlet是动态网页开发技术,Servlet程序就是一个小的java程序,它运行在web服务器中。
编写第一个Servlet程序,向网页中输出”Hello World”
1.在tomcat中新建一个web应用目录(test),在test目录下新建WEB-INF目录,在该目录下新建classes目录,然后新建一个FirstServlet类,编写相应代码。
2.编译FirstServlet,转到该目录下,一般情况下我们的classpath指定的是j2se里面的核心类库,在编译之前在doc窗口中输入以下命令:set classpath=%classpath%;D:\apache-tomcat-6.0.35-windows-x86\apache-tomcat-6.0.35\lib\servlet-api.jar,后面的是tomcat服务器中servlet支持jar包的路径。然后使用javac命令进行编辑。
二、Servlet的生命周期
三、使用MyEclipse开发Servlet
四、HttpServlet
HttpServlet在实现Servlet接口的时候,重写了Service()方法,该方法内部会自动判断请求方式,如果为Get则自动调用doGet(),如果为Post则自动调用doPost(),因此我们在创建Servlet时只要重写doGet(),doPost()方法,而不需要重写Service()。
五、Servlet开发细节
注册Servlet,主要通过servlet节点的<servlet-name> 和 <servlet-class>
映射Servlet,主要通过servlet-mapping节点的<servlet-name>和<url-pattern>
同一个Servlet可以被映射到多个URL上去,通过多个< servlet-name >相同的<servlet-mapping>来实现
<url-pattern>中可以使用通配符,一种格式是*.扩展名,另一种格式是/开头,/*结尾
调用servlet的java程序叫做servlet引擎。
如果在<servlet>中配置了<load-on-startup>元素则服务棋会在启动时就加载并创建Servlet对象。
如果某个Servlet的映射路径是’/’则该Servlet是缺省Servlet,他处理所有其他Servlet都不处理的请求。(所有的请求都是访问Servlet的,访问网页资源的时候正是通过缺省Servlet来实现的)
六、Servlet的线程安全问题
当多个客户并发访问同一个Servlet时,web服务器会为每个请求创建一个线程调用Service方法,如果Service方法中访问了同一个资源就会引发县城安全问题。
如果某个Servlet实现了SingleThreadModel接口,那么Servlet引擎将会以单线程的模式调用Service方法。
七、ServletConfig对象
在Servlet的配置文件中可以使用一个或多个<init-param>标签为Servlet配置初始化参数,web服务器会在创建Servlet对象时,将这些参数封装在ServletConfig对象中,因此我们可以通过ServletConfig对象来获取一个Servlet的初始化参数。通常将Servlet运行时要读取的配置文件写在这里。
八、ServletContext对象
ServletContext对象代表了一个应用,他是一个Context域对象,它里面的方法主要是一些全局性的方法,可以用来存储各个Servlet之间的共享数据。
ServletContext对象的应用场景,主要用于Servlet之间数据共享(可以用来做聊天室),获取web应用的初始化参数,实现Servlet转发,读取资源文件。
配置web应用的初始化参数,在web.xml文件中使用标签<context-param>,通常在这里配置数据库连接,
Servlet的转发和重定向,转发(你来请求我,我将请求转给他),通常转发给jsp用来美化输出,重定向(你来请求我,我让你重新请求他)
RequestDispatcher rd = this.getServletContext().getRequestDispatcher("/1.jsp");
rd.forward(request,response);
九、利用ServletContext读取资源文件
1.
1 InputStream stream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties"); 2 Propertied prop = new Properties(); 3 prop.load(stream); 4 prop.getProperty("user");
2.
//这种方式,可以很方便的获取文件名称
String path = this.getServletContext().getRealPath("/WEB-INF/classes/db.properties");
FileInputStream inStream = new FileInputStream(path);
Propertied prop = new Properties();
prop.load(stream);
prop.getProperty("user");
十、Java web应用中非Servlet程序读取资源文件
1.
//使用类装载器,文件不能太大
publicclass UserDao
{
privatestatic Properties prop = new Properties();
static
{
//InputStream inStream = UserDao.class.getClassLoader().getResourceAsStream("db.properties"); 这种方式无法获取到更新后的数据
String path = UserDao.class.getClassLoader().getResource("db.properties");
FileInputStream inStream = new FileInputStream(path); //这种方式可以获取到更新后的数据
prop.load(inStream);
}
publicvoid update()
{
//引用inStream
}
publicvoid find()
{
//引用inStream
}
}