假设,我有一个拥有大量servlet的Web服务器.对于在这些servlet之间传递的信息,我正在设置会话和实例变量.
现在,如果有2个或更多用户向此服务器发送请求,那么会话变量会发生什么?它们对所有用户都是通用的,或者对于每个用户而言都是不同的.如果它们不同,那么服务器如何区分不同的用户?
还有一个类似的问题,如果有n用户访问特定的servlet,那么这个servlet只在第一个用户第一次访问它时实例化,或者是否为所有用户单独实例化?换句话说,实例变量会发生什么?
java multithreading servlets session-variables instance-variables
我已经开发了一个将信息发送到Servlet的HTML页面.在Servlet中,我使用的方法doGet()和doPost():
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
String id = req.getParameter("realname");
String password = req.getParameter("mypassword");
}
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
String id = req.getParameter("realname");
String password = req.getParameter("mypassword");
}
Run Code Online (Sandbox Code Playgroud)
在调用Servlet的html页面代码中:
<form action="identification" method="post" enctype="multipart/form-data">
User Name: <input type="text" name="realname">
Password: <input type="password" name="mypassword">
<input type="submit" value="Identification">
</form>
Run Code Online (Sandbox Code Playgroud)
当我method = "get"在Servlet中使用时,我获得了id和password的值,但是在使用时method = "post",id和password被设置为null.为什么我不能在这种情况下获得值?
我想知道的另一件事是如何使用Servlet生成或验证的数据.例如,如果上面显示的Servlet对用户进行身份验证,我想在HTML页面中打印用户ID.我应该能够将字符串'id'作为响应发送,并在我的HTML页面中使用此信息.可能吗?
一直试着学习JSF,有时候我看到的URL *.jsf有时是*.xhtml或者/faces/*.请问有人填写我的知识吗?当我使用Facelet创建JSF时,文件扩展名是.xhtml,所以.jsfURL扩展来自哪里?
我对servlet映射的web.xml结构感到困惑,执行它没有任何问题,但我试图弄清楚为什么我们在部署描述符中有这样的模式.
<web-app>
<servlet>
<servlet-name>Servlet1</servlet-name>
<servlet-path>foo.Servlet</servlet-path>
</servlet>
<servlet-mapping>
<servlet-name>Servlet1</servlet-name>
<url-pattern>/enroll</url-pattern>
</servlet-mapping>
</web-app>
Run Code Online (Sandbox Code Playgroud)
现在只要我理解url-pattern"/ enroll"的请求,servlet容器就会将servlet-name与url-pattern匹配,并尝试查找相应的servlet-path并转发控件to foo.Servlet.所以基本上会有两个传递一个用于查找servlet-name而另一个用于servlet-path,我的问题是如果容器设计为以下列方式工作
<web-app>
<servlet>
<servlet-name>foo.Servlet</servlet-path>
<url-pattern>/enroll</url-pattern>
</servlet>
</web-app>
Run Code Online (Sandbox Code Playgroud)
如果我们使用以下方法会有什么缺点.这不会更有效,响应时间也会很快.
如何确保我的java servlet Web应用程序是线程安全的?关于会话变量,类的静态变量或其他任何可能是线程安全问题的问题,我需要做些什么?
我正在开发一个java servlet,在运行时,在新线程中启动不同的对象方法.这些线程应该访问描述特定servlet实例的变量,比如jobId.出于这个原因,我将jobId变量声明为static.servlet构造函数正在为每个servlet实例(调用)计算此值.如果servlet同时被调用几次,我就会徘徊,静态jobId变量在调用之间共享,这意味着一些线程将获得错误的jobId,或者每次调用都计算一次 - 所以线程是启动的特定servlet将使用为此特定servlet计算的jobId(这是我希望它工作的方式).有任何想法吗?非常感谢!
我是Servlets的新手.我想使用一个在部署到服务器后只调用一次的方法.我看了看HttpServlet#init().但我发现每个请求都会调用它.我误解了吗?有什么替代方案init()?
所以我读了这个很棒的线程:servlet的每个实例和servlet中每个servlet线程之间的区别?
它说"servletcontainer为每个请求重用相同的servlet实例."
所以我们假设我们有一个servlet:
public class MyServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Object thisIsThreadSafe;
thisIsThreadSafe = request.getParameter("foo"); // OK, this is thread safe.
}
}
Run Code Online (Sandbox Code Playgroud)
servlet容器初始化时也会在内部调用:
MyServlet myServlet = new MyServlet(....);
Run Code Online (Sandbox Code Playgroud)
然后,当请求与web.xml中的内容匹配时,它将返回此实例myServlet.
我需要帮助理解的是,当致电:
myServlet.doGet(..)
Run Code Online (Sandbox Code Playgroud)
当只有一个实例时,多线程如何工作?这不是特定于servlet的,我只是不能理解这是如何工作的.
假设网站上有10个并发用户在同一时间点击同一个servlet,这个实例在所有这些实例中共享,为什么它不会以串行方式阻塞和工作,它是如何同时执行此操作的呢?