servlet里面的线程可以这么用

servlet也是java的类,同样在servlet里面也可以处理线程,也不是这么说,servlet就是一个多线程的实例,

这样的应用才让java在web应用上面 有一个广泛的推广,下面是一个简单的servlet里面线程的例子:

今天看视频一个老师说不能把servlet里面的session和request引用到java类,里面,经验证完全可以:

恩,好的,那个老师讲错了。。。

首先写一个index.jsp页面 ,内容就一个表单,一个session:

<%
session.setAttribute("username","username");
if(request.getParameter("username") != null){
out.print("<h1>"+request.getParameter("username")+"</h1>");
}
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>this is my form page</title>
</head>
<body>
<form action="MyForm" method="post">
<input type="text" name="username"/>
<input type="submit" name="submit"/>
</form>
</body>
</html>

然后跳转到MyForm的servlet里面处理如下:

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getSession().getAttribute("username");
request.setAttribute("username", new String(request.getParameter("username").getBytes("iso-8859-1"),"gb2312"));
String path = "index.jsp";
//调用MyThread类的构造方法,执行线程把request和name传进去
new MyThread(request, new String(request.getParameter("username").getBytes("iso-8859-1"),"gb2312")).start();
request.getRequestDispatcher(path).forward(request,response);
}

下面 是MyThread类:

import javax.servlet.http.HttpServletRequest;
public class MyThread extends Thread {
private HttpServletRequest request;
private String name;
public MyThread(HttpServletRequest request,String name){
this.request = request;
this.name = name;
}
public void run(){
/*try {
this.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}*/
System.out.println("好吧,我承认"+name+"执行到线程了");
System.out.println(request.getSession().getId());
System.out.println(request.getSession().getAttribute("username"));
}

}

结果输出打印了:

好吧,我承认执行到线程了
583207E987BCE4D8434FEC6A1B53971F
username

这样,一点都没有问题的,把servlet里面的各种属性传入到java类里面做处理

这样就可以一边一边了,呵呵,比如可以上传照片等可以想和sql等一起进行又不影响正常的进程,但是如果你在MyThread里面让线程休眠的话,一会也不行

就会报错,因为你休眠了,
request.getRequestDispatcher(path).forward(request,response);

这句话就会执行,session等就失效率了

因为javaeeAPI里面有这样的介绍:


### 关于Servlet中Goods对象或变量不存在的解决方案 在Servlet中,如果遇到`Goods`对象或变量不存在的问题,通常可能由以下几种原因导致: 1. **生命周期问题**:Servlet是单例模式下的多线程运行环境[^1],实例变量或静态变量可能会因为线程安全问题被覆盖或清空。 2. **作用域问题**:`Goods`对象可能未正确存储到适当的范围(如request、session或application范围)中。 3. **初始化问题**:`Goods`对象可能未在合适的时间点进行初始化。 以下是针对这些问题的具体解决方案: #### 1. 确保Goods对象的正确存储与检索 - 如果需要在多个请求之间共享`Goods`对象,可以将其存储在`session`或`application`范围内。例如: ```java // 存储到session范围 HttpSession session = request.getSession(); session.setAttribute("goods", goods); // 从session范围获取 Goods goods = (Goods) session.getAttribute("goods"); ``` - 如果仅需要在一个请求内使用`Goods`对象,则应将其存储在`request`范围内: ```java // 存储到request范围 request.setAttribute("goods", goods); // 从request范围获取 Goods goods = (Goods) request.getAttribute("goods"); ``` #### 2. 避免线程安全问题 由于Servlet是单例模式,实例变量和静态变量在多线程环境下容易引发线程安全问题。因此,推荐将`Goods`对象作为局部变量处理,或者使用线程安全的容器(如`ThreadLocal`)来管理。 示例代码: ```java private ThreadLocal<Goods> goodsThreadLocal = new ThreadLocal<>(); protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Goods goods = goodsThreadLocal.get(); if (goods == null) { goods = new Goods(); // 初始化Goods对象 goodsThreadLocal.set(goods); } // 使用Goods对象 } ``` #### 3. 检查初始化逻辑 确保`Goods`对象在适当的时间点被正确初始化。例如,在`init()`方法中初始化全局资源: ```java public class GoodsServlet extends HttpServlet { private Goods goods; @Override public void init() throws ServletException { super.init(); goods = new Goods(); // 初始化Goods对象 } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { if (goods != null) { // 使用Goods对象 } else { // 处理Goods对象为空的情况 } } } ``` #### 4. 使用Cookie实现跨请求的数据共享 如果需要在不同Servlet之间共享`Goods`对象的相关信息,可以借助Cookie实现数据共享[^2]。需要注意的是,Cookie只能存储字符串类型的键值对,并且不能包含中文字符。 ```java // 设置Cookie Cookie cookie = new Cookie("goodsId", "12345"); response.addCookie(cookie); // 获取Cookie Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie c : cookies) { if ("goodsId".equals(c.getName())) { String goodsId = c.getValue(); // 根据goodsId加载Goods对象 } } } ``` #### 5. 使用FreeMarker等模板引擎生成动态页面 如果需要在JSP或HTML页面中显示`Goods`对象的内容,可以结合FreeMarker等模板引擎[^3]。通过将`Goods`对象传递给模板引擎的数据模型,可以在页面中动态展示其属性。 ```java Configuration cfg = new Configuration(Configuration.VERSION_2_3_30); cfg.setClassForTemplateLoading(GoodsServlet.class, "/templates"); Map<String, Object> dataModel = new HashMap<>(); dataModel.put("goods", goods); Template template = cfg.getTemplate("goods.ftl"); Writer out = new OutputStreamWriter(response.getOutputStream()); template.process(dataModel, out); ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值