初识servlet
来源:互联网 发布:为知笔记导出epub 编辑:程序博客网 时间:2024/06/06 00:29
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().
- 初识Servlet
- 初识servlet
- servlet初识
- 初识Servlet
- 初识Servlet
- 初识Servlet
- 初识Servlet
- Servlet初识
- 初识servlet
- 初识servlet
- 初识servlet
- 初识servlet
- 初识servlet
- Servlet初识
- 初识Servlet
- 初识servlet
- 初识Servlet
- 初识Servlet
- 结构体内存对齐
- 结构体的字节对齐问题
- Vim编辑技巧
- 对隐式转换保持警觉
- Python 循环
- 初识servlet
- Python dict
- java享元模式
- 03.28 linux系统权限
- Unity3D的内存管理机制
- Ubuntu ssh 免密登录
- Unity3D移动端电量与wifi信号的获取
- 解决:Intellij idea导入MyEclipse Web项目时,服务器搭建运行正常,但无法访问WebRoot下的页面
- jsp编程中遇到的一些问题1-------乱码