HttpServlet从Android客户端在doPost()中接收Null
我正在尝试将一些数据从Android客户端发送到HttpServlet。我的Servlet代码如下HttpServlet从Android客户端在doPost()中接收Null,android,jakarta-ee,servlets,Android,Jakarta Ee,Servlets,我正在尝试将一些数据从Android客户端发送到HttpServlet。我的Servlet代码如下 import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import javax.servle
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DBServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
Connection connection= null;
/**
* @see HttpServlet#HttpServlet()
*/
public DBServlet() {
super();
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
if(request.getParameterNames().hasMoreElements()){
insertRecord(request, getDbConnection());
}
else{ System.out.println("Servlet Started First Time"); }
}
/**
* Return database connection
* @return
*/
private Connection getDbConnection(){
String connectionURL = "jdbc:mysql://127.0.0.1:3306/testDB";
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection(connectionURL, "root", "");
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return connection;
}
/**
* Insert record in database
* @param request
* @param connection
*/
private void insertRecord(HttpServletRequest request, Connection connection){
System.out.println("===== Received Record =====");
PreparedStatement stmt;
try {
stmt = connection.prepareStatement("insert into users(Name,email,password) values(?,?,?)");
stmt.setString(1, request.getParameter("name"));
stmt.setString(2, request.getParameter("e-mail"));
stmt.setString(3, request.getParameter("password"));
int i= stmt.executeUpdate();
if(i != 0){
System.out.println("data inserted !!!");
}
else{
System.out.println("data failed to insert");
}
} catch (SQLException e) {
e.printStackTrace();
}
finally{
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
我的安卓代码是
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import com.example.messenger.R;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class SignUp extends Activity {
Button register;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sign_up);
register = (Button)findViewById(R.id.register);
register.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.v("OnClick", "=== onClick ===");
registerUser();
}
});
}
@SuppressLint({ "NewApi", "NewApi", "NewApi" })
private void registerUser(){
String name= ((EditText)findViewById(R.id.name)).getText().toString();
String email= ((EditText)findViewById(R.id.email)).getText().toString();
String password= ((EditText)findViewById(R.id.password)).getText().toString();
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("name", name));
nameValuePairs.add(new BasicNameValuePair("email", email));
nameValuePairs.add(new BasicNameValuePair("password", password));
try {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
URL url=new URL("http://192.168.1.10:8080/DBservlet/DBServlet");
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setDoOutput(true);
con.setRequestMethod("POST");
DataOutputStream dos=new DataOutputStream(con.getOutputStream());
dos.writeBytes(name);
dos.flush();
dos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
import java.io.DataOutputStream;
导入java.io.IOException;
导入java.net.HttpURLConnection;
导入java.net.URL;
导入java.util.ArrayList;
导入org.apache.http.NameValuePair;
导入org.apache.http.message.BasicNameValuePair;
导入com.example.messenger.R;
导入android.annotation.SuppressLint;
导入android.app.Activity;
导入android.os.Bundle;
导入android.os.StrictMode;
导入android.util.Log;
导入android.view.view;
导入android.widget.Button;
导入android.widget.EditText;
公共类注册扩展了活动{
按钮寄存器;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(右布局、注册);
寄存器=(按钮)findviewbyd(R.id.register);
register.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
Log.v(“OnClick”,“OnClick==”);
registerUser();
}
});
}
@SuppressLint({“NewApi”、“NewApi”、“NewApi”})
私有无效注册器(){
字符串名称=((EditText)findViewById(R.id.name)).getText().toString();
字符串email=((EditText)findViewById(R.id.email)).getText().toString();
字符串密码=((EditText)findViewById(R.id.password)).getText().toString();
ArrayList nameValuePairs=新的ArrayList();
添加(新的BasicNameValuePair(“name”,name));
添加(新的BasicNameValuePair(“email”,email));
添加(新的BasicNameValuePair(“密码”,password));
试一试{
StrictMode.ThreadPolicy policy=新建StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(策略);
URL=新URL(“http://192.168.1.10:8080/DBservlet/DBServlet");
HttpURLConnection con=(HttpURLConnection)url.openConnection();
con.设置输出(真);
con.setRequestMethod(“POST”);
DataOutputStream dos=新的DataOutputStream(con.getOutputStream());
dos.writeBytes(名称);
dos.flush();
dos.close();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
问题是,当我运行“Servlet”时,我会得到输出“Servlet首次启动”,这是正常的,但当我运行android客户端,在EditText字段中写入一些数据,然后按下register按钮时,什么都没有发生Servlet“什么也没有收到。请告诉我如何解决这个问题
在这方面,您的servlet在功能上看起来还不错(从技术上讲,设计不是这样,但这是另一回事)。你的安卓系统看起来绝对不好 这个,
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("name", name));
nameValuePairs.add(new BasicNameValuePair("email", email));
nameValuePairs.add(new BasicNameValuePair("password", password));
但是,您正在使用JavaSE内置的URLConnection
API发送HTTP请求。然后实际上以一种不好的方式;您发送的不是正确的应用程序/x-www-form-urlencoded
查询字符串,而是平台默认编码中的单个字符串值。另外,DataOutputStream
在这种上下文中完全没有意义,您根本没有创建.dat
文件。这感觉太像“roseindia.net片段”。如果你真的在读那个糟糕的网站,请从现在起把它列入终身黑名单
看起来您在Android中混合了发送HTTP POST请求的不同方法
你应该选择其中一个并坚持下去。上面的链接指向堆栈溢出答案的具体示例。我不确定您具体在问什么。您似乎对某项要求进行了观察和陈述。我现在所能想到的就是,“好吧,只需相应地编写代码”。但这将使整个问题毫无用处。请详细阐述具体问题。在编写相应代码时,您到底在哪里结巴?我仍然不理解具体问题。只需放置一个
if
块,检查是否从客户端接收到数据,然后仅在条件为true时执行查询?如果事实上比这更复杂,那么你真的需要详细说明。我们不能为了自己看到你的代码而神奇地传送到你的位置。编辑问题并包含一些明确说明问题的具体代码将非常有助于更好地理解您的具体问题。编辑过程中添加的问题反过来又非常奇怪。是否将doPost()
方法保持为打开状态,直到设置了请求属性?当当前线程基本上表示HTTP请求本身时,这怎么可能呢?您实际上不是指会话属性吗?在提出概念上错误的问题之前,您可能需要投入更多的时间来学习基本HTTP和servlet是如何工作的。这些帖子可能会有帮助:一旦你正确地掌握了基本概念,就要改进这个问题。这还不可理解吗?嗨,巴卢斯克,我没有读到任何来自印度的东西。如果我有什么问题,我来这里:)无论如何,在你回答之前,我已经用HttpClient API而不是URLConnection更改了我的android客户端代码。现在工作正常:)。谢谢你的帮助和支持,但我还有一个问题,为什么它在技术上设计得不好?嗨,巴卢斯克,你能详细解释一下为什么servlet设计在技术上不好吗?
URL url=new URL("http://192.168.1.10:8080/DBservlet/DBServlet");
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setDoOutput(true);
con.setRequestMethod("POST");
DataOutputStream dos=new DataOutputStream(con.getOutputStream());
dos.writeBytes(name);
dos.flush();
dos.close();