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

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

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

<form name="form1" method="post" action="LoginServlet" onsubmit="return od()">
<div class="main">
<p>用户名</p>
<input id="Username" name="Username" type="text" style="font-size:25px" class="inputDiv">
<p>密码</p>
<input id="Password" type="password" style="font-size:25px" name="Password" class="inputDiv" >
<p class="inputDiv">
<p align="center">
<input name="Sub1" type="submit" value="提交" class="button blue">
<input type="button" value="重置" class="button blue" onclick="document.getElementById('Username').value='';document.getElementById('Password').value=''" />
</p>
</div>
</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为例
package com.servlet;

import com.dao.UserDao;
import com.test.JDBconne;
import java.io.IOException;
import java.sql.Connection;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class LoginServlet extends HttpServlet
{
private Connection connection;
public void init() throws ServletException
{
super.init();
//获得数据库连接
connection=JDBconne.getConnetion();
}
public void destroy()
{
super.destroy();
//关闭数据库连接
JDBconne.closeConnection();
} protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
doPost(request, response);
} protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
//获得界面中输入数据
String username=request.getParameter("Username");
String password=request.getParameter("Password"); UserDao userDao = new UserDao();
//check方法 进行数据库比较 判断有没该用户
boolean value = userDao.check(connection, username, password);
if(value)
{
request.getSession().setAttribute("username", username);
request.getRequestDispatcher("userMain.jsp").forward(request, response);
}
else
{ request.getRequestDispatcher("loginfaild.jsp").forward(request, response);
} } }

Servlet生命周期有:

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

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

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

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

首先用

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

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

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

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

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

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

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

4. DAO和javabean的设计

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

package com.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList; public class UserDao
{
// insert方法 向数据库中插入用户信息
public int insert(Connection connection, User user)
{ int value=-1;
PreparedStatement statement=null;
String sql="insert into user(Username,Password,Name,Sex,Tel,Email) values(?,?,?,?,?,?)";
try
{ statement=connection.prepareStatement(sql);
statement.setString(1,user.getUsername());
statement.setString(2,user.getPassword());
statement.setString(3,user.getName());
statement.setString(4,user.getSex());
statement.setString(5,user.getTel());
statement.setString(6,user.getEmail());
value=statement.executeUpdate();
}
catch (SQLException ex)
{
ex.printStackTrace();
}
finally
{
try
{
if(statement != null) statement.close();
}
catch (SQLException ex)
{
}
}
return value;
}
//check方法 根据登录界面传输的用户名和密码与数据库进行比较
// 如果有这用户名则返回真,每有责返回假
public boolean check(Connection connection, String username, String password)
{
boolean value = false;
PreparedStatement statement = null;
ResultSet resultSet = null;
String sql = "select Username from user where Username = ? and Password = ?";
try
{
// 获得PreparedStatement对象,并填充
statement = connection.prepareStatement(sql);
statement.setString(1,username);
statement.setString(2,password);
resultSet = statement.executeQuery();
while(resultSet.next())
{
value = true;
}
return value;
}
catch (SQLException e)
{
}
finally
{
try
{
if(resultSet != null) resultSet.close();
if(statement != null) statement.close();
}
catch (SQLException e)
{
}
}
return value;
} // getUser方法 根据username 进行数据库查询操作
// 将查询出的值放入User对象中 并返回该对象
public User getUser(Connection connection, String username)
{
User user=new User();
String sql="select Username,Password,Name,Sex,Tel,Email from user where Username=?";
PreparedStatement statement=null;
ResultSet result=null; try
{
statement=connection.prepareStatement(sql);
statement.setString(1,username);
result=statement.executeQuery();
while(result.next())
{
user.setUsername(result.getString("Username"));
user.setPassword(result.getString("Password"));
user.setName(result.getString("Name"));
user.setSex(result.getString("Sex"));
user.setTel(result.getString("Tel"));
user.setEmail(result.getString("Email"));
}
return user;
}
catch (SQLException e)
{
}
finally
{
try
{
if(statement!=null)statement.close();
if(result!=null)result.close();
}
catch(SQLException e)
{
}
}
return user;
}
// Update 获得用户修改后的信息 进行数据库的修改操作
public int Update(Connection connection, User user)
{
int value = -1;
PreparedStatement statement = null;
String sql = "update user set Name = ?, Sex = ?, Tel = ?, Email = ? where Username = ?"; try
{
// 获得PreparedStatement对象
statement = connection.prepareStatement(sql);
// 填充statement的参数 statement.setString(1, user.getName());
statement.setString(2, user.getSex());
statement.setString(3, user.getTel());
statement.setString(4, user.getEmail());
statement.setString(5, user.getUsername());
// 执行修改操作
value = statement.executeUpdate();
}
catch (SQLException e)
{
}
finally
{
try
{
if(statement != null) statement.close();
//if(connection != null) connection.close();
}
catch (SQLException e)
{
}
}
return value;
} // UpdatePass 根据用户输入的密码 进行输入密码修改操作
public int UpdatePass(Connection connection,String Password,String username)
{
int value = -1;
PreparedStatement statement = null;
String sql = "update user set Password = ? where Username = ?"; try
{
// 获得PreparedStatement对象
statement = connection.prepareStatement(sql);
// 填充statement的参数
statement.setString(1, Password);
statement.setString(2, username);
// 执行修改操作
value = statement.executeUpdate();
}
catch (SQLException e)
{
}
finally
{
try
{
if(statement != null) statement.close();
//if(connection != null) connection.close();
}
catch (SQLException e)
{
}
}
return value;
} }

UserDao

package com.dao;

import java.io.Serializable;

public class User implements Serializable
{
// JavaBean
// 用于储存用户信息
private static final long serialVersionUID = 1L;
private String username;
private transient String password;
private String name;
private String sex;
private String tel;
private String email;
public String getEmail()
{
return email;
}
public void setEmail(String email)
{
this.email = email;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
public String getTel()
{
return tel;
}
public void setTel(String tel)
{
this.tel = tel;
}
public String getSex()
{
return sex;
}
public void setSex(String sex)
{
this.sex = sex;
}
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
} }

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. C学习笔记-流程控制

    常用的流程图符号 起止框用于表示流程的开始或结束: 输入/输出框用平行四边形表示,在平行四边形内可以写明输入或输出的内容: 判断框用菱形表示,它的作用是对条件进行判断,根据条件是否成立来决定如何执行后 ...

  2. Day1 模拟赛 题解

    T1:首先你要发现,对于任意一个奇数i,i xor (i-1)=1; 那么我们可以将答案转化为统计有多少个1相互异或起来: 所以答案就那么几种: 如果你用的数位DP,只能说明你太高估day1T1了: ...

  3. 2019年9月训练(壹)数位DP (HDU 2089)

    开学之后完全没时间写博客.... HDU 2089 不要62(vjudge) 数位DP 思路: 题目给出区间[n,m] ,找出不含4或62的数的个数 用一个简单的差分:先求0~m+1的个数,再减去0~ ...

  4. Python 常用单词

    Python常用单词(英文好的人自动忽略) 单词 发音 翻译 作用 print 普润特 打印 显示我们想要查看的内容 input 因普特 输入 获取用户输入的一些内容 int 印特 整型 将有引号的数 ...

  5. 基于S7协议实现与西门子PLC通信

    西门子PLC是目前工控行业市场占有额比较大的一款PLC,而且随着上位机的越来越普及, 有很多人开始考虑自己开发上位机实现与西门子PLC的通信,遇到的第一个问题就是数据通信. 其实西门子PLC提供的接口 ...

  6. C#求1-100的质数,100-1000的水仙花数,1-100所有的平方和平方平方根

    //你们的鼓励是我最大的动力 大家可以多留言评论  在接下来很长一段时间我会从初级到高级每天更新 大家有想学习的内容也可以留言哦 //现在是我做C#老师的第28天,希望和大家一起努力 加油 using ...

  7. centos7.4 安装 .net core 2.2

    Step 1:首先注册Microsoft签名密钥,每台机器注册一次就行. sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/pack ...

  8. 异常-try...catch的方式处理异常2

    package cn.itcast_02; /* * A:一个异常 * B:二个异常的处理 * a:每一个写一个try...catch * b:写一个try,多个catch * try{ * ... ...

  9. opencv 一些函数的耗时计算

    Release 模式 -------------------------------------------------- smooth gaussian : 2 cvtColor CV_BGR2La ...

  10. Oracle学习笔记:窗口函数

    目录 1.测试数据 2.聚合函数+over() 3.partition by子句 4.order by子句 5.序列函数 5.1 分析函数之 ntile 5.2 分析函数之 row_number 5. ...