第四章 Servlet技术

来源:互联网 发布:矩阵的秩是矩阵的值么 编辑:程序博客网 时间:2024/04/29 23:39

1、HttpServletRequest接口,在doGet()方法中完成,需要部署web.xml。

文件src.pa.myServlet.java,部署为/servlet/myServlet。doGet()方法如下

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html");response.setCharacterEncoding("gbk");PrintWriter out = response.getWriter();out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");out.println("<HTML>");out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");out.println("  <BODY>");out.print("    This is ");out.print(this.getClass());out.println(", using the GET method");out.print("<br/>");out.print("<p> 上下文路径"+request.getContextPath()+"</p>");out.print("<p>HTTP请求类型  "+request.getMethod()+"</p>");out.print("<p>请求参数"+request.getQueryString()+"</p>");out.print("<p>请求URL"+request.getRequestURL()+"</p>");out.print("<p>请求URI"+request.getRequestURI()+"</p>");out.println("<p>请求servlet路径"+request.getServletPath()+"</p>");out.println("  </BODY>");out.println("</HTML>");out.flush();out.close();}

2、使用Servlet实现注册和登录。连接数据库,注意将jar连接器放置到\WEB-INF\lib下面并解压。

登录页面输入用户名和密码,LoginServlet负责读取数据库验证用户名和密码,若合法,浏览内容,否则重新登录。

注册页面负责添加新的用户到数据库。注册之后返回到登录页面。

数据库的表信息

CREATE TABLE `test`.`tb_user` (  `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',  `username` VARCHAR(45) NOT NULL COMMENT '用户名',  `password` VARCHAR(45) NOT NULL COMMENT '密码',  `sex` VARCHAR(45) NOT NULL COMMENT '性别',  `question` VARCHAR(45) NOT NULL COMMENT '密码问题',  `answer` VARCHAR(45) NOT NULL COMMENT '密码答案',  `email` VARCHAR(45) NOT NULL COMMENT '邮箱',  PRIMARY KEY(`id`))ENGINE = InnoDB;

登录界面

<form action="servlet/LoginServlet" method="post" >  <table width="500" border="0" align="center">  <tr>    <td align="right" width="30%">用户名</td>    <td><input type="text"  name="username" ></td>  </tr>  <tr>    <td align="right">密码</td>    <td><input type="password" name="password"> </td>  </tr>    <td colspan="2" align="center" height="40">    <input type="submit" value="登录">    <input type="reset" value="重置">    </td>  </tr></table></form><div align="center"><a href="register.jsp">注册新用户</a></div>

注册页面

<form action="servlet/RegServlet" method="post" onSubmit="return reg(this);">  <table width="500" border="0" align="center">  <tr>    <td align="right" width="30%">用户名</td>    <td><input type="text"  name="username" ></td>  </tr>  <tr>    <td align="right">密码</td>    <td><input type="password" name="password"> </td>  </tr>  <tr>    <td align="right">确认密码</td>    <td><input type="password" name="=repassword"></td>  </tr>  <tr>    <td align="right">性别</td>    <td>    <input type="radio" name="sex" value="男">男        <input type="radio" name="sex" value="女">女    </td>  </tr>  <tr>    <td align="right">密码找回问题</td>    <td><input type="text" name="question" ></td>  </tr>  <tr>    <td align="right">密码找回答案</td>    <td><input type="text" name="answer" ></td>  </tr>  <tr>    <td align="right">邮箱</td>    <td><input type="text" name="email"></td>  </tr>  <tr>    <td colspan="2" align="center" height="40">    <input type="submit" value="注册">    <input type="reset" value="重置">    </td>  </tr></table>    </form>

内容页面content.jsp
LoginServlet.java

//重写init(),完成数据库的连接

在doPost()完成变量的读取和sql语句的执行

//验证过程只是读取数据库中的第一条满足姓名要求的记录。

private Connection conn;public void init() throws ServletException {super.init();try{Class.forName("com.mysql.jdbc.Driver");String url="jdbc:mysql://localhost:3306/test";conn=DriverManager.getConnection(url,"root","xhp");}catch(Exception e){e.printStackTrace();}}
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html");//设置request和response的编码request.setCharacterEncoding("gbk");response.setCharacterEncoding("gbk");//获取表单的属性值String username=request.getParameter("username");String password=request.getParameter("password");//判断连接是否成功if(conn!=null){try{//插入查询信息的SQL语句String sql="select * from tb_user where username like '"+username+"'";Statement stmt=conn.createStatement();ResultSet rs=stmt.executeQuery(sql);if(rs.next()){                                     if(rs.getString("password").equals(password)){PrintWriter out=response.getWriter();out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");out.println("<HTML>");out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");out.println("  <BODY>");out.print("登录成功!");out.print(" <a href=http://10.2.205.49:8080/4.04/content.jsp>访问内容</a> ");out.println("  </BODY>");out.println("</HTML>");out.flush();out.close();}else{PrintWriter out=response.getWriter();out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");out.println("<HTML>");out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");out.println("  <BODY>");out.print("密码不匹配,登录失败!");out.print(" <a href=http://10.2.205.49:8080/4.04/index.jsp>重新登录</a> ");out.println("  </BODY>");out.println("</HTML>");out.flush();out.close();}}else{PrintWriter out=response.getWriter();out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");out.println("<HTML>");out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");out.println("  <BODY>");out.print("未查询到记录,登录失败!");out.print(" <a href=http://10.2.205.49:8080/4.04/index.jsp>重新登录</a> ");out.println("  </BODY>");out.println("</HTML>");out.flush();out.close();}}catch(Exception e){e.printStackTrace();}}else{response.sendError(500,"数据库连接错误");}}

RegServlet.java

init()方法同上,doPost()完成变量的读取和sql语句的执行
//不进行同名用户的检验

public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html");//设置request和response的编码request.setCharacterEncoding("gbk");response.setCharacterEncoding("gbk");//获取表单的属性值String username=request.getParameter("username");String password=request.getParameter("password");String sex=request.getParameter("sex");String question=request.getParameter("question");String answer=request.getParameter("answer");String email=request.getParameter("email");//判断连接是否成功if(conn!=null){try{         //插入注册信息的SQL语句String sql="insert into tb_user(username,password,sex,question,answer,email)"+"values(?,?,?,?,?,?)";//创建PreparedStatement 对象PreparedStatement ps=conn.prepareStatement(sql);//对SQL语句中的参数动态赋值ps.setString(1, username);ps.setString(2, password);ps.setString(3, sex);ps.setString(4, question);ps.setString(5, answer);ps.setString(6, email);//执行更新操作ps.executeUpdate();//获取PrintWriter对象PrintWriter out=response.getWriter();//输出注册结果out.print(username+"注册成功!");out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");out.println("<HTML>");out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");out.println("  <BODY>");out.print(" <a href=http://10.2.205.49:8080/4.04/index.jsp>登录系统</a> ");out.println("  </BODY>");out.println("</HTML>");out.flush();out.close();}catch(Exception e){e.printStackTrace();}}else{response.sendError(500,"数据库连接错误");}}

3、简单Servlet计算器

页面设计

 <h2>Servlet 计算器</h2>    <form action="servlet/calculator" method="post">     数1:<input type="text" name="a"><br><br>    数2:<input type="text" name="b"><br>        选择操作符:        <input type="radio" name="operator"  value="plus">+        <input type="radio" name="operator"  value="sub">-        <input type="radio" name="operator"  value="mul">*        <input type="radio" name="operator"  value="div">/        <br><br>        <input type="submit" value="计算">    </form>

Servlet处理
也是在doPost()方法中完成

public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html");PrintWriter out = response.getWriter();out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");out.println("<HTML>");out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");out.println("  <BODY>");out.print("    This is ");out.print(this.getClass());out.println(", using the POST method");int a=Integer.parseInt(request.getParameter("a"));int b=Integer.parseInt(request.getParameter("b"));String op=request.getParameter("operator");int result=0;//保存计算结果if(op.equals("plus")){result=a+b;}else{if(op.equals("sub")){result=a-b;}else{if(op.equals("mul")){result=a*b;}else{if(op.equals("div")){result=a/b;}else{result=0;}}}}out.println("<br>"+"result:"+result+"<br/>");out.println("  </BODY>");out.println("</HTML>");out.flush();out.close();}

(1)操作数未进行验证,只是string

(2)除数可为0

(3)结果在int范围,非double,非float

(4)什么都不输入,也不报错。只是调试器自己处理,未进行人为处理

4、本章还有过滤器的介绍和使用,跳过了,没看