仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 506|回复: 11
打印 上一主题 下一主题

[学习教程] JAVA网页设计编写线程平安的JSP

[复制链接]
简单生活 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:21:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
IDE是好。java中的IDE更是百花齐放,你用jbuilder能说jbuilder赶不上vs吗?用eclipse,netbeans也很舒服啊。我就不明白“稍微差一些”那一些是从哪里差来的。js|平安JSP默许是以多线程体例实行的,这是JSP与ASP,PHP,PERL等剧本言语纷歧样的中央,也是它的上风之一,但假如不注重多线程中的同步成绩,会使所写的JSP程序有难以发明的毛病。上面以一个例子申明JSP中的多线程成绩及办理办法。
1、JSP的中存在的多线程成绩:
当客户端第一次哀求某一个JSP文件时,服务端把该JSP编译成一个CLASS文件,并创立一个该类的实例,然后创立一个线程处置CLIENT真个哀求。假如有多个客户端同时哀求该JSP文件,则服务端会创立多个线程。每一个客户端哀求对应一个线程。以多线程体例实行可年夜年夜下降对体系的资本需求,进步体系的并发量及呼应工夫.对JSP中大概用的的变量申明以下:
实例变量
实例变量是在堆平分配的,并被属于该实例的一切线程共享,以是不是线程平安的.
JSP体系供应的8个类变量
JSP顶用到的OUT,REQUEST,RESPONSE,SESSION,CONFIG,PAGE,PAGECONXT是线程平安的,APPLICATION在全部体系内被利用,以是不是线程平安的.
部分变量
部分变量在仓库平分配,由于每一个线程都有它本人的仓库空间,以是是线程平安的.
静态类
静态类不必被实例化,便可间接利用,也不是线程平安的.
内部资本:
在程序中大概会有多个线程或历程同时操纵统一个资本(如:多个线程或历程同时对一个文件举行写操纵).此时也要注重同步成绩.
2、上面的例子存在的多线程成绩:

<%@pageimport="
javax.naming.*,
java.util.*,
java.sql.*,
weblogic.common.*
"%>


<%
Stringname
Stringproduct;
longquantity;

name=request.getParameter("name");
product=request.getParameter("product");
quantity=request.getParameter("quantity");/*(1)*/
savebuy();
%>

<%!
publicvoidsavebuy()
{
/*举行数据库操纵,把数据保留到表中*/
try{
Propertiesprops=newProperties();
props.put("user","scott");
props.put("password","tiger");
props.put("server","DEMO");
DrivermyDriver=(Driver)iver").newInstance();
conn=myDriver.connect("jdbc:weblogic:oracle",props);
stmt=conn.createStatement();

Stringinssql="insertintobuy(empid,name,dept)values(?,?,?,?)";
stmt=conn.prepareStatement(inssql);
stmt.setString(1,name);
stmt.setString(2,procuct);
stmt.setInt(3,quantity);
stmt.execute();
}
catch(Exceptione)
{
System.out.println("SQLExceptionwasthrown:"+e.getMessage());
}
finally//closeconnectionsand{
try{
if(stmt!=null)
stmt.close();
if(conn!=null)
conn.close();
}catch(SQLExceptionsqle){
System.out.println("SQLExceptionwasthrown:"+sqle.getMessage());
}
}
}
%>
下面的程序摹拟网上购物中的一部分,把用户在扫瞄器中输出的用户名,购置的物品称号,数目保留到表BUY中。在savebuy()函数顶用到了实例变量,以是它不是线程平安的.由于:程序中的每条语句都不是原子操纵,如name=request.getParameter("name");在实行是会对应多个呆板指令,在任什么时候候都大概因体系调剂而转入眠眠形态,让其他的线程持续实行.假如线程A在实行到(1)的时分转入眠眠形态,线程B入手下手实行并改动QUANTITY的值,那末当又到A实行时,它会从挪用savebuy()函数入手下手实行,如许它保留到表中的QUANTITY是被线程B悔改的值,那末线程A对应的用户所实践购置的数目与坚持到表中的数据纷歧致.这是个很严峻的成绩.

3、办理办法
接纳单线程体例
在该JSP文件中加上:,使它以单线程体例实行,这时候,仍旧只要一个实例,一切客户真个哀求以串行方式实行。如许会下降体系的功能.
对函数savebuy()加synchronized举行线程同步,该JSP仍旧以多线程体例实行,但也会下降体系的功能
publicsynchronizedvoidsavebuy()
{
......
}
接纳部分变量取代实例变量,函数savebuy()声明以下:
由于在savebuy()中利用的是传给他的形参,是在仓库平分配的,以是是线程平安的.
publicvoidsavebuy(Stringname,Stringproduct,intquantity)
{
......
}
挪用体例改成:
<%
Stringname
Stringproduct;
longquantity;
name=request.getParameter("name");
product=request.getParameter("product");
quantity=request.getParameter("quantity");
savebuy(name,product,quantity)
%>

假如savebuy的参数良多,或这些数据要在良多中央用到,也可声明一个类,并用他做参数,如:
publicclassbuyinfo
{
Stringname;
Stringproduct;
longquantity;
}
publicvoidsavebuy(buyinfoinfo)
{
......
}
挪用体例改成:
<%
buyinfouserbuy=newbuyinfo();
userbuy.name=request.getParameter("name");
userbuy.product=request.getParameter("product");
userbuy.quantity=request.getParameter("quantity");
savebuy(userbuy);
%>
以是最好是用3,由于1,2会下降体系的功能.
多线程成绩一样平常只要在在年夜并发量会见时,才有大概呈现,而且很难反复呈现,以是应在编程时就时候注重。

作者简介
dev2devID:xcjing,BEA资深手艺参谋,到场BEA中国多年,在流派手艺、RFID办理计划上有着丰厚的履历。


你总不能说你写框架吧,那无疑会加大工作量,现在大多企业采取的是折中的办法,就是改别人写好的框架,可要改框架,前提是你对这个框架足够的了解,这就更难了。
变相怪杰 该用户已被删除
沙发
发表于 2015-1-20 20:56:48 | 只看该作者
你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。
莫相离 该用户已被删除
板凳
发表于 2015-1-30 05:04:26 | 只看该作者
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
飘飘悠悠 该用户已被删除
地板
发表于 2015-2-5 10:38:20 | 只看该作者
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
飘灵儿 该用户已被删除
5#
发表于 2015-2-11 09:08:26 | 只看该作者
是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言
老尸 该用户已被删除
6#
发表于 2015-2-15 18:48:05 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
透明 该用户已被删除
7#
发表于 2015-2-17 00:35:21 | 只看该作者
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
简单生活 该用户已被删除
8#
 楼主| 发表于 2015-2-25 02:33:11 | 只看该作者
你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。
爱飞 该用户已被删除
9#
发表于 2015-3-6 02:34:34 | 只看该作者
如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。
冷月葬花魂 该用户已被删除
10#
发表于 2015-3-7 02:06:22 | 只看该作者
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
11#
发表于 2015-3-14 00:51:33 | 只看该作者
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
分手快乐 该用户已被删除
12#
发表于 2015-3-20 22:58:06 | 只看该作者
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-9-28 15:30

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表