- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想请你帮忙澄清几个问题。但是,在任何事情之前,首先要输入一些代码——这是我构建的一个非常简单的登录示例。
容器是 Tomcat 5.5.27。
假设输入了正确的用户名和密码组合;问题在底部。
LoginPage.jsp(入口点 - View )
<%@ page language="java" contentType="text/html; charset=windows-1250" pageEncoding="windows-1250"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<link rel="stylesheet" type="text/css" href="mystyle.css" />
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Login Page</title>
</head>
<body>
<div id="page">
<div id="content_container">
<div id="content">
<form action="LoginServlet">
Username: <input type="text" name="username"><br>
Password: <input type="text" name="password"><br>
<input type="submit" value="Submit">
</form>
</div>
</div>
</div>
</body>
</html>
LoginServlet.java( Controller )
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public LoginServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
UserBean user = new UserBean();
user.setUsername(request.getParameter("username"));
user.setPassword(request.getParameter("password"));
user = UserDAO.login(user);
if(user.isValid()){
HttpSession session = request.getSession();
session.setAttribute("currentSessionUser", user);
response.sendRedirect("userLogged.jsp");
} else {
response.sendRedirect("invalidLogin.jsp");
}
} catch (Exception e){
e.printStackTrace();
}
}
}
UserDAO.java(“服务”类)
//snipped imports and such
public class UserDAO {
static Connection currConn = null;
static ResultSet rs = null;
public static UserBean login(UserBean userBean) {
Statement stmt = null;
String username = userBean.getUsername();
String password = userBean.getPassword();
String searchQuery = "SELECT * FROM pilots x WHERE x.email = '" + username + "' AND x.password = '" + password + "'";
System.out.println("Your user name is " + username);
System.out.println("Your password is " + password);
System.out.println("Query: " + searchQuery);
try {
currConn = ConnectionManager.getConnection();
stmt = currConn.createStatement();
rs = stmt.executeQuery(searchQuery);
boolean more = rs.next();
if (!more) {
System.out.println("Sorry, you are not a registered user! Please sign up first");
userBean.setValid(false);
} else {
String firstName = rs.getString("FIRST_NAME");
String lastName = rs.getString("LAST_NAME");
System.out.println("Welcome " + firstName);
userBean.setFirstName(firstName);
userBean.setLastName(lastName);
userBean.setValid(true);
}
} catch (Exception ex) {
System.out.println("Log In failed: An Exception has occurred! " + ex);
ex.printStackTrace();
} finally {
if(rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(currConn != null){
try {
currConn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return userBean;
}
}
UserBean.java(模型,用作DTO的经典POJO/bean)
//...
public class UserBean {
private String username;
private String password;
private String firstName;
private String lastName;
private boolean valid;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public boolean isValid() {
return valid;
}
public void setValid(boolean valid) {
this.valid = valid;
}
}
userLogged.jsp(退出点 - View )——不用管 div 元素——
<%@ page language="java" contentType="text/html; charset=windows-1250" pageEncoding="windows-1250"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<link rel="stylesheet" type="text/css" href="mystyle.css" />
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Successful login!</title>
</head>
<body>
<div id="page">
<div id="content_container">
<div id="content">
<jsp:useBean id="currentSessionUser" class="examplePackage.UserBean" scope="application">
Welcome, <jsp:getProperty name="currentSessionUser" property="username"/> <br>
********<br>
Test 0 -> ${param.name}<br>
Test 1 -> ${paramValues.name[0]}<br>
Test 2 -> ${paramValues[name[0]]}<br>
Test 3 -> ${param["name"]}<br>
Test 4 -> ${param.username}<br>
Test 5 -> ${param["username"]}<br>
Test 6 -> ${sessionScope.currentSessionUser.username}<br>
*******<br>
Test 7 -> ${header.host}<br>
Test 8 -> ${header["host"]}<br>
Test 9 -> ${pageContext.request.method}<br>
</jsp:useBean>
</div>
</div>
</div>
</body>
</html>
网页输出如下(直接从FireFox c/p):
Welcome, USER_X
********
Test 0 ->
Test 1 ->
Test 2 ->
Test 3 ->
Test 4 ->
Test 5 ->
Test 6 -> USER_X
*******
Test 7 -> localhost:8080
Test 8 -> localhost:8080
Test 9 -> GET
1) 我的第一个问题是关于范围 - 哪个范围实际适用?如果您检查 userLogged.jsp 的第 13 行和第 22 行(L13 和 L22),您会看到我的困境 - 如果我在 L13 中使用除“应用程序”之外的任何其他范围,L14 将返回空值。另一方面,如果我在 L22 上使用 applicationScope,它会返回 null(因为它应该很好,因为我设置的是 SESSION 属性,而不是上下文属性!)。所以,问题是——我为什么要在 L13 上使用 application scope?从我的 Controller 中可以看出,除了 session 范围外,我没有其他期望。
2) 另一个问题是关于 EL - 为什么我不能在测试 0-5 中获取请求参数?其他东西工作正常(从输出中可以看出),但我不明白如何打印出这些请求参数(通过请求 EL 隐式对象)。
3) 我也很好奇为什么如果我使用它就不起作用(userLogged.jsp 的 L24,将属性更改为 property="*"
)?
Welcome, <jsp:getProperty name="currentSessionUser" property="*"/>
它返回 null,并且我已经根据 JavaBeans 规范匹配了我的域对象 (UserBean) 属性。我希望它会返回所有 userBean 属性,这些属性与 LoginPage.jsp 中的输入类型字段匹配,并且是使用该功能的正确类型(必须是字符串或原始类型)。
非常感谢您
关于埃克
最佳答案
您不需要 jsp:useBean
或 jsp:getProperty
。摆脱他们。您已经在使用 servlet,并且已经将登录用户放入 session 范围内,并在该行中使用键 currentSessionUser
:
session.setAttribute("currentSessionUser", user);
要显示用户名,您只需执行以下操作:
<p>Welcome, ${currentSessionUser.username}</p>
为了防止 XSS,使用 JSTL c:out
:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
...
<p>Welcome, <c:out value="${currentSessionUser.username}" /></p>
你肯定不想把它放在应用范围内。它将应用于所有网站访问者。
关于您的请求参数问题:您正在使用 response.sendRedirect()
触发一个重定向。这基本上会指示网络浏览器在给定的 URL 上创建一个全新的请求。您没有传递任何参数,因此它在重定向请求中确实不可用。一切都按预期工作。如果您希望原始请求参数在结果页面中仍然可用,那么您应该使用 RequestDispatcher#forward()
request.getRequestDispatcher("page.jsp").forward(request.response);
或者通过重定向传递参数
response.sendRedirect("page.jsp?param1=" + URLEncoder.encode(param1, "UTF-8"));
顺便说一下,您的 DAO 代码中存在一个主要问题:它不是线程安全的。连接和结果集被声明为 static
。它还容易出现资源泄漏,finally
中没有关闭。
根据评论更新:
当您使用 ${key}
在 EL 上下文中引用一个对象时,它会在后台使用 JspContext#findAttribute()
分别在页面、请求、 session 和应用程序范围内定位关联值,并返回第一个非空值。
至于jsp:useBean
,您基本上是在应用程序范围内定义一个新的 bean,而不是在 session 范围内引用现有的 bean。如果您在应用程序范围内将它显式引用为 ${applicationScope.currentSessionUser}
,您会发现它返回的结果与您在 servlet 的 session 范围内设置的不一样。您需要将 scope="application"
替换为 scope="session"
。
至于property="*"
,这仅在您转发之前回答的请求时有效。这些将从请求参数中设置。
不,finally
肯定不是反模式。然而,它是初学者中最容易被误解/被低估的关键字之一。 finally
block 不会使其成为线程安全的。它可以防止资源泄漏。删除 static
并在方法本地 block 中声明资源将使其成为线程安全的。关于DAO模式,你可能会发现this article有用。
关于java - JSP EL 和 scope 属性混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3520115/
我在这里有我的 javascript 代码: define(['controllers/controllers', 'services/alerts'], function(module) {
的意义是什么scope = scope-token *( SP scope-token ) scope-token = 1*( %x21 / %x23-5B / %x5D-7E ) 在 RFC6749
我是 AngularJS 的新手。我试图找出这两个 Controller 定义之间的区别: app.controller('simpleController', ['$scope', function
似乎所有 Guice 的开箱即用 Scope 实现本质上都是基于线程的(或完全忽略线程): Scopes.SINGLETON和 Scopes.NO_SCOPE忽略线程并且是边缘情况:全局范围和无范围。
如果这个问题涉及的是一个常见问题,我很抱歉,但我发现这个问题非常抽象,并且无法真正为其构建一个好的 Google 搜索词。 我试图理解并找到 Maven 中提供的依赖项的用例。我的想法是这样的: 假设
假设我有以下 Controller angular.module('scopeExample', []) .controller('MyController', ['$scope', func
当前在TmThemeEditor上注册的243种配色方案中, 我注意到几乎没有人使用范围选择器运算符。 对于以下情况,运算符非常有用: (text.html | text.xml) & (meta.t
我有一些行为不符合预期的代码......我在 AngularJS Controller 中有一个事件监听器,如下所示: $scope.$on("newClipSelected", function(e
首先,如果帖子太长,我深表歉意。另外,为了以防万一这会以某种方式干扰您可能给我的答案,我不会以通常的方式定义我的 Controller 。相反,我关注http://www.technofattie.c
我有一个模式,其中许多项目类型都是“可编辑的”。这意味着我有很多模板(每种可编辑项目类型一个),这些模板期望具有唯一的字段,但具有通用功能(编辑、保存、取消编辑、删除等)。这些常见功能导致 Contr
$evalAsync 和 $applyAsync 之间有什么区别?我的理解是,当我从指令中使用 $evalAsync 时,表达式将在浏览器呈现之前进行计算。 举个例子,如果我想滚动到页面上的特定位置但
我试图为一个 $scope 变量提供另一个 $scope 变量的值。有人能告诉我出了什么问题吗?查看简单的 plunker 了解详细信息: http://plnkr.co/edit/TlKnd2fM5
我有以下一段 Angular 代码 $scope.prepare = function(){ $scope.elems = [1,2,3]; }; $scope.action = functio
我正在关注 Angularjs 的官方教程,但我陷入了第 2 步。 这是一个片段,我不明白 $scope:scope 的含义, describe('PhoneListCtrl', function()
根据文档, Global: Component is shared among all users. Session: Separate instances of the component are
显示作用域变量,类似于 Angularjs 中的 ng-repeat 元素 这些是我的范围变量 $scope.published = true; $scope.count = 3; 我还有一个名为 l
我是 Angular 的新手,我想在普通的 javascript 中做一些非常简单的事情,但我无法找到如何在 Angular 中正确地做到这一点! 我想设置一个通用函数来清除输入文本字段: 我有这个
在article中发现了这样一个idea : Notice how the value function takes the scope as parameter (without the $ in
注释部分将位于 $scope.$on 下。我需要将 options 返回到我保存 $scope.$emit 的地方。请帮助!!! if (gridConfig.Batch) {
我有一个带有 2 个作用域的 Controller : app.controller('search', function($scope) { $scope.value1 = '';
我是一名优秀的程序员,十分优秀!