初识servlet

来源:互联网 发布:为知笔记导出epub 编辑:程序博客网 时间:2024/06/06 00:29
Servlet是sun公司提供的一门用于开发动态web资源的技术。
  Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤:
  1、编写一个Java类,实现servlet接口。
  2、把开发好的Java类部署到web服务器中。

  按照一种约定俗成的称呼习惯,通常我们也把实现了servlet接口的java程序,称之为Servlet

Servlet接口SUN公司定义了两个默认实现类,分别为:GenericServlet、HttpServlet。

  HttpServlet指能够处理HTTP请求的servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。

一.开发一个servlet程序在浏览器显示“你好 servlet”

1.首先新建class继承httpservlet,右键——resourse-overide..--选择倒数第二个方法,删掉方法体中自带的语句。并添加如下语句

res.setContentType("text/html;charset=utf-8");//设置输出编码为utf-8,输出内容中可以包含中文

PrintWriter pw = res.getWriter();//获取输出流对象

pw.println("你好,servlet");

pw.close();//关闭输出流。

2.配置web文件

打开web.xml

添加如下代码:

<servlet>
   <servlet-name>listEmpServlet</servlet-name>      //为servlet程序其个别名
  <servlet-class>web.ListEmpServlet</servlet-class>  //声明servlet程序路径名

<load-on-startup>1</load-on-startup>//该属性设置servlert启动时机,servlet默认在服务器接受到请求时实例化,设置该属性后服务器会在启动

时实例化该servlet,当中的值设置实例化顺序。数值越小越先实例化。
  </servlet>
  <servlet-mapping>
  <servlet-name>listEmpServlet</servlet-name> //servlet的别名
  <url-pattern>/list</url-pattern> //servlet访问路径地址,若该路径为 / ,则该Servlet是服务器缺省值,即请求路径不存在时自动启用该servlet。

  </servlet-mapping>

二.获取提交页面的请求参数   getParameter 和 getParameterValues

 String name = req.getParameter("name");
Double salary = Double.valueOf(req.getParameter("salary"));

若name对应的值不只一个则: String[] contacts = req.getParameterValues("name");

三.浏览器、服务器、数据库间的交互

1.在浏览器输入员工信息点击保存,将该员工信息存入数据库表emp

浏览器表单的action属性值为servlet的路径名即web.xml中的  "/路径名";将浏览器的数据提供给该servlet程序执行

servlet先获取浏览器提供的数据 

String name = req.getParameter("name");
Double salary = Double.valueOf(req.getParameter("salary"));
int age = Integer.parseInt(req.getParameter("age"));

 获取输出流对象
PrintWriter pw = res.getWriter();

将接受到的数据插入数据库

事先建好数据库连接工具类 DBUtil;

Connection con=null;try {con = DBUtil.getConnection();String sql = "insert into emp values(id_seq.nextval,?,?,?)";PreparedStatement ps = con.prepareStatement(sql);ps.setString(1,name);ps.setDouble(2,salary);ps.setInt(3,age);ps.executeUpdate();pw.println("添加成功");} catch (SQLException e) {pw.println("系统繁忙稍后再试");e.printStackTrace();}finally{DBUtil.close(con);} pw.close();


 2.查询数据库中emp的表数据用表格形式返回给浏览器

//设置输出浏览器的编码格式res.setContentType("text/html;charset=utf-8");PrintWriter pw = res.getWriter();Connection con=null;try {//建立数据库连接并获取查询结果con = DBUtil.getConnection();String sql = "select * from emp";PreparedStatement ps = con.prepareStatement(sql);ResultSet rs = ps.executeQuery();//向浏览器输出一个表格pw.println("<table>");pw.println("<caption>员工信息</caption>");pw.println(" <tr>");pw.println(" <th>ID</th>");pw.println(" <th>姓名</th>");pw.println(" <th>薪水</th>");pw.println(" <th>年龄</th>");pw.println(" </tr>");while(rs.next()){int id = rs.getInt("ID");String name = rs.getString("name");            double salary = rs.getDouble("salary");            int age = rs.getInt("age");pw.println(" <tr>");pw.println("<td>"+id+"</td>");pw.println("<td>"+name+"</td>");pw.println("<td>"+salary+"</td>");pw.println("<td>"+age+"</td>");pw.println(" </tr>");}pw.println("</table>");} catch (SQLException e) {pw.println("系统繁忙稍后再试");e.printStackTrace();}finally{DBUtil.close(con);}


三.servlet线程安全问题

原因:多个线程操作一个共享资源

解决方案:①实现 SingleThreadModel 接口,服务器会对每一个请求创建一个servlet来进行业务处理。

用synchronized 关键字能保证一次只有一个线程可以访问被保护的区段。

四servlet生命周期

1.服务器实例化servlet

2.servlet调用初始化方法init();

2.处理请求调用servlice();

3.服务器关闭时调用destory().



原创粉丝点击