仓酷云

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

[学习教程] JAVA网站制作之编写线程平安的JSP程序

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

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

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

x
再说说缺点:首先java功能强大的背后是其复杂性,就拿web来说,当今流行的框架有很多,什么struts,spring,jQuery等等,而这无疑增加了java的复杂性。js|平安|程序<p>
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、上面的例子存在的多线程成绩:
<P><%@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文件中加上:<%@pageisThreadSafe="false"%>,使它以单线程体例实行,这时候,仍旧只要一个实例,一切客户真个哀求以串行方式实行。如许会下降体系的功能.
  • 对函数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会下降体系的功能.
多线程成绩一样平常只要在在年夜并发量会见时,才有大概呈现,而且很难反复呈现,以是应在编程时就时候注重。




先说优点,首先和C,C++这些语言比起来,java很简单,去掉指针的java,非常好理解,自动垃圾回收机制也很好,自从JDK1.5推出以后,性能上又有了很大提高。
admin 该用户已被删除
沙发
发表于 2015-1-21 12:30:52 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
第二个灵魂 该用户已被删除
板凳
发表于 2015-1-26 15:40:20 | 只看该作者
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
蒙在股里 该用户已被删除
地板
发表于 2015-2-4 15:21:05 | 只看该作者
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
分手快乐 该用户已被删除
5#
发表于 2015-2-9 16:45:02 | 只看该作者
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
若相依 该用户已被删除
6#
发表于 2015-2-27 11:50:23 | 只看该作者
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
变相怪杰 该用户已被删除
7#
发表于 2015-3-9 01:49:58 | 只看该作者
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
冷月葬花魂 该用户已被删除
8#
发表于 2015-3-16 19:53:46 | 只看该作者
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
深爱那片海 该用户已被删除
9#
发表于 2015-3-24 12:13:43 | 只看该作者
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
兰色精灵 该用户已被删除
10#
发表于 2015-4-1 03:50:23 | 只看该作者
Java是一种计算机编程语言,拥有跨平台、面向对java
活着的死人 该用户已被删除
11#
发表于 2015-4-6 06:42:59 | 只看该作者
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
谁可相欹 该用户已被删除
12#
发表于 2015-4-15 04:43:54 | 只看该作者
象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
海妖 该用户已被删除
13#
发表于 2015-5-4 02:01:45 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
简单生活 该用户已被删除
14#
发表于 2015-6-9 09:59:11 | 只看该作者
是一种为 Internet发展的计算机语言
若天明 该用户已被删除
15#
发表于 2015-6-17 20:39:39 | 只看该作者
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
乐观 该用户已被删除
16#
发表于 2015-7-9 12:37:28 | 只看该作者
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
金色的骷髅 该用户已被删除
17#
发表于 2015-7-11 22:13:55 | 只看该作者
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
再现理想 该用户已被删除
18#
发表于 2015-7-13 06:31:59 | 只看该作者
还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。
精灵巫婆 该用户已被删除
19#
发表于 2015-7-16 16:19:01 | 只看该作者
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-29 07:46

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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