javaweb servlet
(一)servlet生命周期
servlet什么时候生?第一次访问时
servlet什么时候死?web应用停止的时候
servlet存在的时候执行什么方法?第一次创建时,执行init函数初始化,每次请求会执行service函数,摧毁的时候destory会被执行
(二)一个servlet
public class ServletDemo extends GenericServlet {
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
// TODO Auto-generated method stub
res.getOutputStream().write("hello".getBytes());
}
}
(三)设置servlet模板
MyEclipse\Common\plugins
然后直接在该目录下搜索
com.genuitec.eclipse.wizards_9.0.0.me201108091322.jar
这个文件,不要去找,不容易找到,这是一个jar包,然后用压缩文件打开,找到里面的Servlet.java文件,修改就可以了
注:1、复制工程改名之后的配置跟原来的工程名都一样,需要在properties中的web更改发布目录
2、servlet用于注册servlet 包含servlet-name:设置注册名称
servlet-class: servlet完整类名
3、servlet-mapping 映射一个已注册的servlet的一个对外访问路径包含servlet-name和url-pattern(对外访问路径)
4、load-on-startup:服务器启动时候就创建servlet
(四)servlet线程安全(只有资源共享时才有安全问题)
SingleThreadModel接口
没有定义的接口叫标记接口,不可以序列化
有类继承了标记接口就可以实现序列化。servlet可以建立多个servlet
//子类在覆盖父类的方法,不能抛出比父类更多的异常
(五)SevletConfig(用于调用JDBC来操作数据库,数据不适合在程序里面写死
例如:servlet采用哪个码表,servlet连接到哪个库、servlet哪个配置文件
)
当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,程序员通过servletConfig对象就可以得到当前servlet的初始化参数信息。
1、现在servlet中添加
<init-param>
<param-name>data</param-name>
<param-value>xxxxx</param-value>
</init-param>
2、将servlet中的信息添加得到servletConfig中
3、在函数中复写init方法:this.config = config;
4、定义变量记住servletConfig:private ServletConfig config;
5、doGet中config.getInitParameter(“data”);
6、因为父类定义好了config,可以将5中的config改为this.getServletConfig()
(六)servletContext
每个web应用都会创建一个servletContext对象,编写servlet时通过ServletConfig.getServletContext方法获得ServletContext。
多个servlet通过servletContext实现数据共享,
被称为域对象
共有4个域对象servletConfig request session page
1、获取web应用初始化参数
2、servlet的转发(注意与重定向区别:客户机一次请求,重定向客户机2次请求)
例如:将代码转给jsp输出
RequestDispatcher rd =this.getServletContext().getRequestDispatcher(“文件路径”);
rd.forward(request,response);
而将数据带给jsp不能通过context域带过去,应该用request域
3、servletContext读取资源文件
配置文件分为两种web.xml 和 properties
没有关系的数据用properties
有关系的数据用web.xml
// servletContext读取资源文件
private void test() throws IOException {
InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties prop = new Properties();
prop.load(in);
String url = prop.getProperty("url");
String username = prop.getProperty("username");
String password = prop.getProperty("password");
System.out.println(url+" "+username+" "+password);
}
//servletContext的getRealPath得到资源的绝对路劲后,再通过传统留读取资源文件
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String path = this.getServletContext().getRealPath("/WEB-INF/classes/db.properties");
FileInputStream in = new FileInputStream(path);
Properties prop = new Properties();
prop.load(in);
String url = prop.getProperty("url");
String username = prop.getProperty("username");
String password = prop.getProperty("password");
System.out.println(url+" "+username+" "+password);
}
//如果读取资源文件的不是servlet,就只能通过类装载器去读,配置文件不要太大
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
UserDao dao = new UserDao();
dao.update();
}
public class UserDao {
private static Properties dbconfig = new Properties();
static{
try{
InputStream in = UserDao.class.getClassLoader().getResourceAsStream("db.properties");
dbconfig.load(in);
}catch(Exception e){
throw new ExceptionInInitializerError(e);
}
}
public void update() throws IOException{
System.out.println(dbconfig.getProperty("url"));
}
}
//通过类装载的方式得到资源文件位置,传统方式读取数据,这样可以读取更新后的数据
String path = UserDao.class.getClassLoader().getResource("db.properties").getPath();
FileInputStream in = new FileInputStream(path);
Properties pro = new Properties();
pro.load(in);
System.out.println(pro.getProperty("url"));
浙公网安备 33010602011771号