servlets - request.getRequestDispatcher().forward() 无法显示请求的 HTML
问题描述
我正在为数据库管理器 Web 应用程序制作原型。成功登录后,应用程序需要导航到数据库管理器视图 (dbmanager.html)。但是,请求的页面不会显示在浏览器中。
环境为 Windows 10、Apache-Tomcat-7.0.94、Glassfish 4、MySql 5.7.24。
登录.html
<form id="login_form" name="login_form" action="LogIn"
method="post" onsubmit="formPost(this);return false;">
<fieldset>
<!-- more fields here -->
<input id="input_login" value="Login" type="submit" >
</fieldset>
<p id="mesg" style="color: red;"></p>
</form>
登录.java
@WebServlet(name = "LogIn", urlPatterns = { "/LogIn" })
@MultipartConfig
public class LogIn extends HttpServlet {
protected void doPost(
HttpServletRequest request,
HttpServletResponse response
) throws ServletException, IOException {
//get the inputs, customized method getParameter
String user = getParameter("user");
String password = getParameter("password");
//validate inputs
String errorMsg = null;
if(user == null || user.equals("")){
errorMsg ="User can't be null or empty";
}
if(password == null || password.equals("")){
errorMsg = "Password can't be null or empty";
}
//show error, if so
if(errorMsg != null){
response.setContentLength("#mesg=".length() + errorMsg.length());
PrintWriter out= response.getWriter();
out.println("#mesg=" + errorMsg);
return;
}
//no errors, forward / redirect to next page
request.getRequestDispatcher("/contents/dbmanager.html")
.forward(request, response);
}
protected void doGet(
HttpServletRequest request,
HttpServletResponse response
) throws ServletException, IOException {
request.getRequestDispatcher("/contents/dbmanager.html")
.forward(request, response);
}
}
JavaScript(没有 jQuery)
function formPost(_form){
var xhr = new XMLHttpRequest();
xhr.open(_form.method, _form.action);
xhr.onload = function(event){
event.preventDefault(); // Important! Prevents submitting the form.
var response = event.target.response;
//process response...
console.log(response);
//response is a array of string of structure {id=value}
var idMark = response.indexOf("#");
if( isNaN(idMark) ){
return;
}
if(idMark !== 0){
return;
}
//other validations here...
};
// or onerror, onabort
var formData = new FormData(_form);
xhr.send(formData);
}
解决方案
I set up following code in DBManager
servlet and updated the JS.
The Servlet
@WebServlet(name = "DBManager", urlPatterns = { "/DBManager" })
@MultipartConfig
public class DBManager extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.print("DBManager dG conx:");
Connection conx =
(Connection) ((HttpSession)LogIn.getHTTPSession()).getAttribute("Connection");
System.out.println(conx.toString());
}
}
I am pulling the Connection
object from LogIn
servlet where it was created.
The edited JS
function onload(){
//alert("win.loc:"+window.location);
var url = window.location;
var pageName = url;
if(url===null || pageName===null) {return;}
url = url.toString();
//other logic go here
if(pageName === "dbmanager"){
processGet(url);
}
}
function processGet(url){
alert("processGet url="+url);
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
var data = xhr.responseText;
alert("DBManager xhr.responseText:"+data);
}
}
xhr.open('GET', 'DBManager', true);
xhr.send(null);
}
Result in System.out
prints like...
LogIn dP con=com.mysql.cj.jdbc.ConnectionImpl@1df9967
DBManager dG conx:com.mysql.cj.jdbc.ConnectionImpl@1df9967
Works for me.
推荐阅读
- arrays - 如何从数组中将随机选择的字符串拉入 PIL 的文本函数并在元数据中使用
- javascript - 如何使用 for 循环创建打字效果
- php - 属于Parent模型的三个模型的Laravel 8关系
- angular-cli - ng12 更新指令产生损坏的应用程序
- json - Best Buy Developer API 最大页面大小和分页
- python - 没有这样的列:dashboard_book.id django
- sql - 优化更新第一个、最后一个、倒数第二个排名值
- android - Android Kotlin - viewBinding 类型不匹配:推断类型为 DrawerLayout 但预期为 ConstraintLayout
- excel - 如何用百分比和空白单元格做 SUMPRODUCT
- python - Cython 如何让 help() 描述方法