在从HTML提交数据后,servlet将这些数据添加到我的数据库并将结果消息转发到JSP页面.我希望在转发之后保留表单中最初提交的值.
在servlet中创建一个对象并添加我收到的所有参数并向JSP发送请求是否明智?还有另一种更好的方法吗?
书中有很多很多例子,互联网上有关如何将Servlet用作JSP的例子.但是我想知道使用它们的最佳方法是什么,以及对良好架构的思考.
Servlet与JSP之间是否存在一对一的关系?像ASP.NET"Code-Behind"页面一样?
或者更像是ASP.NET MVC,只有一个Servlet控制多个动作,并转发到多个视图?
这是关于纯Java EE开发的问题.请不要简单地建议另一个框架.
下面的URL,所选答案中的第一个内容描述了JSP隐藏.
我到目前为止了解到我可以将jsp文件放在/ WEB-INF目录下.这样就可以防止用户直接访问http://test.com/WEB-INF/register.jsp(返回404)
我以为我理解但不想并且想要更好地描述,所以我在这里提出问题.
比方说,我有2个jsp文件.
web应用/ ROOT /针对home.jsp
web应用/ ROOT/WEB-INF/register.jsp
注意:/go_register映射到Registerweb.xml(DD)中的servlet类
针对home.jsp
<html>
<body>
<a href="/go_register">Go to register.jsp</a>
<body>
</html>
Run Code Online (Sandbox Code Playgroud)
register.jsp
<html>
<body>
<form method="post" action="/process_register">
<input type="submit">
</form>
<body>
</html>
Run Code Online (Sandbox Code Playgroud)
所以..因为register.jsp位于/ WEB-INF /下,所以只有RequestDispatcher可以访问它.这意味着我需要创建用于转发请求的servlet.
public class Register extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String address = "/WEB-INF/register.jsp";
request.getRequestDispatcher(address).forward(request, response);
}
}
Run Code Online (Sandbox Code Playgroud)
但这看起来不对.如果我想将登录页面/WEB-INF/login.jsp添加到home.jsp,为了访问login.jsp,我必须创建另一个servlet 只是为了进入登录页面目的 ???
public class Login extends HttpServlet {
public void doGet(HttpServletRequest request, …Run Code Online (Sandbox Code Playgroud) 我有一组JSP页面,我想隐藏.jsp扩展名(经过一番研究后,看来对SEO很有用)。
我遇到的一种解决方案是:
<servlet>
<servlet-name>mypage</servlet-name>
<jsp-file>/some-page.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>mypage</servlet-name>
<url-pattern>/some-page</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)
虽然这样做可行,但我相信我必须为网站上的每个jsp页面设置此映射。
我遇到了这里发布的另一个解决方案(易于使用的URL):JSP / Servlet的隐藏功能
...,它使用一个简单的servlet来转发请求。在我的web.xml中,我可以执行以下操作:
<servlet>
<servlet-name>MyServletName</servlet-name>
<servlet-class>myservlets.PrettyUrlServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServletName</servlet-name>
<url-pattern>/myservlet/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)
现在的问题是我不想点击以下URL:www.mydomain.com/myservlet/some-page
我想使用以下网址:www.mydomain.com/some-page
所以我将url-pattern更改为“ / *”
<servlet>
<servlet-name>MyServletName</servlet-name>
<servlet-class>myservlets.PrettyUrlServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServletName</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)
但这会导致无限循环:
Exception in thread "http-bio-8080-exec-1" java.lang.StackOverflowError
at org.apache.catalina.core.ApplicationHttpRequest.getAttribute(ApplicationHttpRequest.java:219)
at org.apache.catalina.core.ApplicationHttpRequest.getAttribute(ApplicationHttpRequest.java:228)
.
.
at org.apache.catalina.core.ApplicationHttpRequest.getAttribute(ApplicationHttpRequest.java:228)
at org.apache.catalina.core.ApplicationHttpRequest.getAttribute(ApplicationHttpRequest.java:228)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:379)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:329)
at myservlets.PrettyUrlServlet.doGet(PrettyUrlServlet.java:22)
Run Code Online (Sandbox Code Playgroud)
我不确定该如何解决。有任何想法吗?
我需要在JSP中执行按位测试,但是我一生都无法弄清楚如何使用EL进行测试。
我想做类似的事情:
<c:if test="${(test & testFor) == testFor}">
<h3>Test Passed</h3>
</c:if>
Run Code Online (Sandbox Code Playgroud)
当然,我可以使用普通的JSP语法来做到这一点:
<% if ((test & testFor) == testFor) { %>
<h3>Test Passed</h3>
<% } %>
Run Code Online (Sandbox Code Playgroud) 我已经设置了许多Java Server Pages,我想通过添加Process Servlet(扩展HttpServlet)来使用Controller/View系统.
我只是想在ProcessServlet添加一些属性后基本上处理所请求的JSP.
假设我的所有JSP都在名为/ content /的目录中,并且我的web.xml文件有一条规则将/content/*.jsp映射到我的ProcessServlet
我无法找到将所有JSP移动到不同目录(/ content-JSPs /)的方法,这样就可以无需经过ProcessServlet就可以调度它们.
有没有办法基本上将#forward()(其他一些方法?)分配给所请求的JSP,而不必再次通过ProcessServlet?
有点难以相信这种缺乏灵活性的存在.为什么Servlet不能仅仅作为JSP的传递?
我的目标是设置所有内容,以便Web服务器不必为所有JSP创建单独的目录,而为其他所有内容创建另一个目录,即CSS,JavaScript和图像.我想保持目录结构(和URL结构)不变.
我是java新手,我遇到的问题是将类/ bean(存储在arraylist中)传递给servlet.任何想法我怎么能实现这一目标?下面是我的代码.
package myarraylist;
public class fypjdbClass {
String timezone;
String location;
public String getTimezone() {
return timezone;
}
public void setTimezone(String timezone) {
this.timezone = timezone;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public fypjdbClass() {
super();
ArrayList<fypjdbClass> fypjdbList = new ArrayList<fypjdbClass>();
this.timezone = timezone;
this.location = location;
}
public static void main(String[] args) {
//Establish connection to MySQL database
String connectionURL = "jdbc:mysql://localhost/fypjdb";
Connection connection=null;
ResultSet rs;
try …Run Code Online (Sandbox Code Playgroud) 我想请你帮忙澄清一些问题.但是,在此之前,有些代码首先是入站代码 - 这是我构建的一个非常简单的登录示例.
容器是Tomcat 5.5.27.
假设输入了正确的用户名和密码组合; 问题在底部.
LoginPage.jsp(入口点 - 视图)
<%@ 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>
Run Code Online (Sandbox Code Playgroud)
LoginServlet.java(控制器)
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public LoginServlet() …Run Code Online (Sandbox Code Playgroud) 我正在阅读的所有在线参考文献和首页JSP和Servlet书都说明了RequestDispatcher和Redirect(即resoponse.sendRedirect())的特性,如:
"请求调度程序" - 浏览器栏中的URL不会更改.
"重定向" - 用户在浏览器中看到新URL.
但根据我的测试,对于RequestDispatcher,我看到URL发生了变化,所以我不明白它们的真正含义.
使用下面的代码,
我在http://whatever.com/tmp3.jsp,这就是浏览器中的URL所说的.
单击按钮调用servlet,然后将数据转发给服务器,然后服务器将响应发送回浏览器,因此浏览器中的URL现在显示 http://whatever.com/register
所以.. URL改了!(从.../tmp3.jsp到... /注册)
任何人都可以向我解释"浏览器中的URL不会改变"的含义吗?
例:
(tmp3.jsp)
<html>
<head>
</head>
<body>
${message}
<!-- click button to send request to servlet -->
<form method="POST" action="register">
<input type="submit" value="click!">
</form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
(servlet的)
package com.masatosan.tmp;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Tmp extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse …Run Code Online (Sandbox Code Playgroud) 我想在我的JSP页面工作中应用MVC2 J2EE方法.我想在JSP中分离Servlet中的代码和设计.我面临的问题是我想在JSP页面中显示所有用户及其数据从DB表到HTML表现在我应该如何从JSP页面调用servlet,因为显示页面中没有表单我不知道是否可以使用调度程序,因为管理员将单击<a href>display users,JSP页面应显示所有uesrs.我该怎么做?