3. JSP提交数据和Servlet程序设计

想要将JSP数据提交,主要的方法有form表单方式、url方式和Session方式。将JSP数据传递给后台,form表单显然比较简单方便。

正如上一节中展示的那样:

  1. <form name="form1" method="post" action="LoginServlet" onsubmit="return od()">
  2. <div class="main">
  3. <p>用户名</p>
  4. <input id="Username" name="Username" type="text" style="font-size:25px" class="inputDiv">
  5. <p>密码</p>
  6. <input id="Password" type="password" style="font-size:25px" name="Password" class="inputDiv" >
  7. <p class="inputDiv">
  8. <p align="center">
  9. <input name="Sub1" type="submit" value="提交" class="button blue">
  10. <input type="button" value="重置" class="button blue" onclick="document.getElementById('Username').value='';document.getElementById('Password').value=''" />
  11. </p>
  12. </div>
  13. </form>

form表单将input中输入的数据获取,之后传输到action属性中的网址(或Servlet),method属性说明数据的提交方式,onsubmit则针对form表单的js方法,用于处理一些非法操作,比如空用户名等,当onsubmit返回真值是,表单才能提交成功。

那get方式和post方式提交会有什么不同吗?答案是肯定的:

  • 如果希望获得最佳表单传输性能,可以采用 GET 方法发送只有少数简短字段的小表单。
  • 一些服务器操作系统在处理可以立即传递给应用程序的命令行参数时,会限制其数目和长度,在这种情况下,对那些有许多字段或是很长的文本域的表单来说,就应该采用 POST 方法来发送。
  • 如果你在编写服务器端的表单处理应用程序方面经验不足,应该选择 GET 方法。如果采用 POST 方法,就要在读取和解码方法做些额外的工作,也许这并不很难,但是也许你不太愿意去处理这些问题。
  • 如果安全性是个问题,那么我们建议选用 POST 方法。GET 方法将表单参数直接放在应用程序的 URL 中,这样网络窥探者可以很轻松地捕获它们,还可以从服务器的日志文件中进行摘录。如果参数中包含了信用卡帐号这样的敏感信息,就会在不知不觉中危及用户的安全。而 POST 应用程序就没有安全方面的漏洞,在将参数作为单独的事务传输给服务器进行处理时,至少还可以采用加密的方法。
  • 如果想在表单之外调用服务器端的应用程序,而且包括向其传递参数的过程,就要采用 GET 方法,因为该方法允许把表单这样的参数包括进来作为 URL 的一部分。而另一方面,使用 POST 样式的应用程序却希望在 URL 后还能有一个来自浏览器额外的传输过程,其中传输的内容不能作为传统 <a> 标签的内容。
 (来源
 
action中的Servlet(指本例,还可以是其他所有的url)接收到数据后,即可进行相应的处理,比如,在数据库中查询数据是否存在。对应与form表单两种提交方式post和get,Servlet有两个相应的处理方法doGet()和doPost()方法。以判断登陆信息的Servlet为例
  1. package com.servlet;
  2.  
  3. import com.dao.UserDao;
  4. import com.test.JDBconne;
  5. import java.io.IOException;
  6. import java.sql.Connection;
  7. import javax.servlet.ServletException;
  8. import javax.servlet.http.HttpServlet;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11.  
  12. public class LoginServlet extends HttpServlet
  13. {
  14. private Connection connection;
  15. public void init() throws ServletException
  16. {
  17. super.init();
  18. //获得数据库连接
  19. connection=JDBconne.getConnetion();
  20. }
  21. public void destroy()
  22. {
  23. super.destroy();
  24. //关闭数据库连接
  25. JDBconne.closeConnection();
  26. }
  27.  
  28. protected void doGet(HttpServletRequest request, HttpServletResponse response)
  29. throws ServletException, IOException
  30. {
  31. doPost(request, response);
  32. }
  33.  
  34. protected void doPost(HttpServletRequest request, HttpServletResponse response)
  35. throws ServletException, IOException
  36. {
  37. //获得界面中输入数据
  38. String username=request.getParameter("Username");
  39. String password=request.getParameter("Password");
  40.  
  41. UserDao userDao = new UserDao();
  42. //check方法 进行数据库比较 判断有没该用户
  43. boolean value = userDao.check(connection, username, password);
  44. if(value)
  45. {
  46. request.getSession().setAttribute("username", username);
  47. request.getRequestDispatcher("userMain.jsp").forward(request, response);
  48. }
  49. else
  50. {
  51.  
  52. request.getRequestDispatcher("loginfaild.jsp").forward(request, response);
  53. }
  54.  
  55. }
  56.  
  57. }

Servlet生命周期有:

初始化,init()方法实现;第一次被访问时,Servlet被创建,然后执行init方法,可以进行初始化工作,如连接数据库。

服务阶段,service()方法实现;用于处理doGet()和doPost()方法。

销毁,destroy()方法实现;回收资源,Servlet服务器正常关闭时,执行destroy方法,只执行一次。

而HTTPServlet是一般自定义Servlet去继承的,它以实现init(),destroy()和service()方法,因此只需继承即可,若想进行资源的初始化或者释放,可以重写inti()和destroy(0方法。而重写doPost()和doGet()方法几乎是必须的。我们以doPost()为例熟悉他的流程。

首先用

  1. request.getParameter("Username")
  2. request.getParameter("Password")

获取JSP传递的数据,参数是表单中元素的name!

接下来dao部分之后在说,作用主要是判断是否存在这对用户名和密码在数据库中是否存在并且返回bool值,如果正确:

  1. request.getSession().setAttribute("username", username);
  2. request.getRequestDispatcher("userMain.jsp").forward(request, response);

前一句代码与Session有关,前面提到了JSP传递数据可以使用url,表单和Session等,这里使用Session设置一个属性保存用户名,并且进入新的页面,而且新页面能够通过getAttribute()方法获取,这都是后话。如果错误:

  1. request.getRequestDispatcher("loginfaild.jsp").forward(request, response);

直接进入登陆失败的界面。getRequestDispatcher()和sendRedirect()方法的区别,前者是服务器内部的跳转,后者是页面重定向,可以跳转至任意网址;前者是request调用,后者是response调用。

4. DAO和javabean的设计

UserDao具体作用是用户类与数据库交互的类,而用户类即User类,是Javabean的组成部分。

  1. package com.dao;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.PreparedStatement;
  5. import java.sql.ResultSet;
  6. import java.sql.SQLException;
  7. import java.sql.Statement;
  8. import java.util.ArrayList;
  9.  
  10. public class UserDao
  11. {
  12. // insert方法 向数据库中插入用户信息
  13. public int insert(Connection connection, User user)
  14. {
  15.  
  16. int value=-1;
  17. PreparedStatement statement=null;
  18. String sql="insert into user(Username,Password,Name,Sex,Tel,Email) values(?,?,?,?,?,?)";
  19. try
  20. {
  21.  
  22. statement=connection.prepareStatement(sql);
  23. statement.setString(1,user.getUsername());
  24. statement.setString(2,user.getPassword());
  25. statement.setString(3,user.getName());
  26. statement.setString(4,user.getSex());
  27. statement.setString(5,user.getTel());
  28. statement.setString(6,user.getEmail());
  29. value=statement.executeUpdate();
  30. }
  31. catch (SQLException ex)
  32. {
  33. ex.printStackTrace();
  34. }
  35. finally
  36. {
  37. try
  38. {
  39. if(statement != null) statement.close();
  40. }
  41. catch (SQLException ex)
  42. {
  43. }
  44. }
  45. return value;
  46. }
  47. //check方法 根据登录界面传输的用户名和密码与数据库进行比较
  48. // 如果有这用户名则返回真,每有责返回假
  49. public boolean check(Connection connection, String username, String password)
  50. {
  51. boolean value = false;
  52. PreparedStatement statement = null;
  53. ResultSet resultSet = null;
  54. String sql = "select Username from user where Username = ? and Password = ?";
  55. try
  56. {
  57. // 获得PreparedStatement对象,并填充
  58. statement = connection.prepareStatement(sql);
  59. statement.setString(1,username);
  60. statement.setString(2,password);
  61. resultSet = statement.executeQuery();
  62. while(resultSet.next())
  63. {
  64. value = true;
  65. }
  66. return value;
  67. }
  68. catch (SQLException e)
  69. {
  70. }
  71. finally
  72. {
  73. try
  74. {
  75. if(resultSet != null) resultSet.close();
  76. if(statement != null) statement.close();
  77. }
  78. catch (SQLException e)
  79. {
  80. }
  81. }
  82. return value;
  83. }
  84.  
  85. // getUser方法 根据username 进行数据库查询操作
  86. // 将查询出的值放入User对象中 并返回该对象
  87. public User getUser(Connection connection, String username)
  88. {
  89. User user=new User();
  90. String sql="select Username,Password,Name,Sex,Tel,Email from user where Username=?";
  91. PreparedStatement statement=null;
  92. ResultSet result=null;
  93.  
  94. try
  95. {
  96. statement=connection.prepareStatement(sql);
  97. statement.setString(1,username);
  98. result=statement.executeQuery();
  99. while(result.next())
  100. {
  101. user.setUsername(result.getString("Username"));
  102. user.setPassword(result.getString("Password"));
  103. user.setName(result.getString("Name"));
  104. user.setSex(result.getString("Sex"));
  105. user.setTel(result.getString("Tel"));
  106. user.setEmail(result.getString("Email"));
  107. }
  108. return user;
  109. }
  110. catch (SQLException e)
  111. {
  112. }
  113. finally
  114. {
  115. try
  116. {
  117. if(statement!=null)statement.close();
  118. if(result!=null)result.close();
  119. }
  120. catch(SQLException e)
  121. {
  122. }
  123. }
  124. return user;
  125. }
  126. // Update 获得用户修改后的信息 进行数据库的修改操作
  127. public int Update(Connection connection, User user)
  128. {
  129. int value = -1;
  130. PreparedStatement statement = null;
  131. String sql = "update user set Name = ?, Sex = ?, Tel = ?, Email = ? where Username = ?";
  132.  
  133. try
  134. {
  135. // 获得PreparedStatement对象
  136. statement = connection.prepareStatement(sql);
  137. // 填充statement的参数
  138.  
  139. statement.setString(1, user.getName());
  140. statement.setString(2, user.getSex());
  141. statement.setString(3, user.getTel());
  142. statement.setString(4, user.getEmail());
  143. statement.setString(5, user.getUsername());
  144. // 执行修改操作
  145. value = statement.executeUpdate();
  146. }
  147. catch (SQLException e)
  148. {
  149. }
  150. finally
  151. {
  152. try
  153. {
  154. if(statement != null) statement.close();
  155. //if(connection != null) connection.close();
  156. }
  157. catch (SQLException e)
  158. {
  159. }
  160. }
  161. return value;
  162. }
  163.  
  164. // UpdatePass 根据用户输入的密码 进行输入密码修改操作
  165. public int UpdatePass(Connection connection,String Password,String username)
  166. {
  167. int value = -1;
  168. PreparedStatement statement = null;
  169. String sql = "update user set Password = ? where Username = ?";
  170.  
  171. try
  172. {
  173. // 获得PreparedStatement对象
  174. statement = connection.prepareStatement(sql);
  175. // 填充statement的参数
  176. statement.setString(1, Password);
  177. statement.setString(2, username);
  178. // 执行修改操作
  179. value = statement.executeUpdate();
  180. }
  181. catch (SQLException e)
  182. {
  183. }
  184. finally
  185. {
  186. try
  187. {
  188. if(statement != null) statement.close();
  189. //if(connection != null) connection.close();
  190. }
  191. catch (SQLException e)
  192. {
  193. }
  194. }
  195. return value;
  196. }
  197.  
  198. }

UserDao

  1. package com.dao;
  2.  
  3. import java.io.Serializable;
  4.  
  5. public class User implements Serializable
  6. {
  7. // JavaBean
  8. // 用于储存用户信息
  9. private static final long serialVersionUID = 1L;
  10. private String username;
  11. private transient String password;
  12. private String name;
  13. private String sex;
  14. private String tel;
  15. private String email;
  16. public String getEmail()
  17. {
  18. return email;
  19. }
  20. public void setEmail(String email)
  21. {
  22. this.email = email;
  23. }
  24. public String getName()
  25. {
  26. return name;
  27. }
  28. public void setName(String name)
  29. {
  30. this.name = name;
  31. }
  32. public String getPassword()
  33. {
  34. return password;
  35. }
  36. public void setPassword(String password)
  37. {
  38. this.password = password;
  39. }
  40. public String getTel()
  41. {
  42. return tel;
  43. }
  44. public void setTel(String tel)
  45. {
  46. this.tel = tel;
  47. }
  48. public String getSex()
  49. {
  50. return sex;
  51. }
  52. public void setSex(String sex)
  53. {
  54. this.sex = sex;
  55. }
  56. public String getUsername()
  57. {
  58. return username;
  59. }
  60. public void setUsername(String username)
  61. {
  62. this.username = username;
  63. }
  64.  
  65. }

User

其中的代码均已复习过,至此,一个的完整MVC架构已经呈现,其实现在Servlet技术已落后于潮流,这两篇博客也不是要进行相关语法的学习,而是大致了解web开发的基础知识,能够理解其中的开发思想,这也是永远不会落后过时的。

JAVA WEB之Servlet使用的更多相关文章

  1. Java Web之Servlet中response、request乱码问题解决

    Java Web之Servlet中response.request乱码问题解决   一.request请求参数出现的乱码问题 get请求: get请求的参数是在url后面提交过来的,也就是在请求行中, ...

  2. java web中servlet、jsp、html 互相访问的路径问题

    java web中servlet.jsp.html 互相访问的路径问题 在java web种经常出现 404找不到网页的错误,究其原因,一般是访问的路径不对. java web中的路径使用按我的分法可 ...

  3. 使用Intellij idea新建Java Web项目(servlet) 原理及初步使用

    准备 JDK       (配置JDK_HOME\bin   和 CLASSPATH)   注:JDK8下载已经需要注册了,请使用JDK11(现在是官方长期支持的版本)     对于我们新手来说,JD ...

  4. JAVA WEB 用servlet实现分页,思路比较清晰和简单。

    JAVA WEB 用servlet实现分页,思路比较清晰和简单.借鉴了其他大佬的思路.特别感谢. 是我第一次发表博客,如果有什么错误,欢迎大家指出!,谢谢 一.思路分析 前台一定是有类似这种的界面 点 ...

  5. Java Web之Servlet技术

    1.Servlet基础 针对Servlet技术开发,Sun公司提供了一些列接口和类,其中最重要的是javax.servlet.Servlet接口,两个重要的包是javax.servlet和javax. ...

  6. Java Web之Servlet

    Servlet参考文献: 1.http://www.cnblogs.com/luoxn28/p/5460073.html 2.http://www.cnblogs.com/xdp-gacl/p/376 ...

  7. Java Web(一) Servlet详解!!

    这篇文章到上一篇,距离的有点遥远呀,隔了大概有两个月把,中间在家过了个年,哈哈~ 现在重新开始拾起,最近在看一本个人觉得很棒的书,<Java Web 整合开发王者归来>,现在写的这一系列基 ...

  8. 初学Java Web(4)——Servlet学习总结

    经过一段时间的学习,对于Servlet有了新的不一样的见解,在这里做一下总结,将近来学习到的知识总结一下. Servlet 的请求流程 浏览器发出请求:http://localhost:80/xxx1 ...

  9. (转)Java Web(一) Servlet详解!!

    https://www.cnblogs.com/whgk/p/6399262.html 这篇文章到上一篇,距离的有点遥远呀,隔了大概有两个月把,中间在家过了个年,哈哈~ 现在重新开始拾起,最近在看一本 ...

  10. Java Web(二) Servlet详解

    什么是Servlet? Servlet是运行在Web服务器中的Java程序.Servlet通常通过HTTP(超文本传输协议)接收和响应来自Web客户端的请求.Java Web应用程序中所有的请求-响应 ...

随机推荐

  1. python列表的切片与复制

    切片,即处理一个完整列表中部分数据. 语法 变量[起始索引:终止索引:步长] 首先创建一个字符串列表 >>> cars = ['toyota', 'honda', 'mazda', ...

  2. Windows 下部署 hadoop spark环境

    一.先在本地安装jdk 我这里安装的jdk1.8,具体的安装过程这里不作赘述 二.部署安装maven 下载maven安装包,并解压 设置环境变量,MAVEN_HOME=D:\SoftWare\Mave ...

  3. CentOS7之yum仓库配置

    操作系统版本:CentOS Linux release 7.2.1511 (Core)  Yum软件版本:yum-3.4.3-132.el7.centos.0.1.noarch  Yum主配置文件:/ ...

  4. T100——接口代码记录,jsonArray和json

    {<section id="cs_t1client.description" >} #應用 a00 樣板自動產生(Version:) #+ Version..: T10 ...

  5. k-means算法处理聚类标签不足的异常

    k-means算法在人群聚类场景中,是一个非常实用的工具.(该算法的原理可以参考K-Means算法的Python实现) 常见调用方式 该算法常规的调用方式如下: # 从sklearn引包 from s ...

  6. Java EE javax.servlet中的ServletResponse接口

    ServletResponse接口 public interface ServletResponse 子接口:HttpServletResponse 实现类:HttpServletResponseWr ...

  7. redis 学习(18)-- AOF

    redis -- AOF 什么是 AOF 通过日志方式将redis中的写命令进行日志记录,保存在硬盘文件中. 日志记录的实质是将写命令写在硬盘的缓冲区中,再根据相关策略把数据刷新到磁盘中. 当redi ...

  8. Spring Boot 版本支持

    一.Spring Boot 版本支持 Spring Boot Spring Framework Java Maven Gradle 1.2.0之前版本   6 3.0+ 1.6+ 1.2.0 4.1. ...

  9. Java super与this

    一.super()与this() 1.super(): 只能出现在子类构造器中 且必须位于第一行. 所有子类构造器默认调用super()方法 参数决定使用父类哪一个构造器. 若父类没有相应的构造器,则 ...

  10. Python(八) —— 异常(概念、捕获、传递、抛出)

    异常的概念 捕获异常 异常的传递 抛出异常 异常的概念 程序在运行时,如果 Python 解释器 遇到 到一个错误,会停止程序的执行,并且提示一些错误信息,这就是 异常 程序停止执行并且提示错误信息  ...