jsp编码规范

2024-07-16

jsp编码规范(共7篇)

jsp编码规范 篇1

山东锋士自动化系统有限公司

C# 编码规范

指导规则和最佳实践 Version 1.0

董毅 2010/4/26

第一条 编码的风格和细节要求

编码风格

至少在单一文件中缩进和风格要保持一致,同一行中内容不要太长,最好不要大于10个单词。不要随意地或者以容易混淆作用域嵌套关系的方式放置括号,要尽量遵循每个文件中已经使用的体例。

命名约定和规范

1.不要使用晦涩的名称,起名要简单易懂

a.避免使用单字母做变量名,比如:i 或者 t。应使用index或者temp进行替代 b.不要缩写单词,比如用num代替number 2.使用全大写字母表示宏,常量,如:LIKE_THIS 3.类,函数和枚举的名称的单词首字母大写,如:LikeThis public class SomeClass {

const int DefaultSize = 100;public void SomeMethod(){ } } 4.变量的首字母小写,其他单词首字母大写,如:likeThis void MyMethod(int someNumber){ int number;} 5.接口的第一个字母用I开头

interface IMyInterface {...} 6.私有成员变量以m_开头,剩余内容遵从首字母大写的规范

public class SomeClass { private int m_Number;} 7.属性类以Attribute做后缀,异常类以Exception做后缀

8.命名方法以【动词】-【目标】组成,比如:ShowDialog()

9.拥有返回值的方法应该以返回值描述其方法名,比如:GetObjectState()10.总是使用C#的预定义类型,而不是System命名空间中的别名,比如:

object 而不是

Object string 而不是

String int

而不是

Int32 11.对于基类,类型描述采用大写字母。当处理.NET中的类型时才保留后缀Type //正确

public class LinkedList { } //避免

public class LikedList { }

12.使用有意义的名字空间,比如项目名称或者公司名称 13.避免使用类的全称,而是使用using语句进行引用 14.避免在命名空间内使用using语句

15.将所有framework命名空间吗放在一起,后面放自定义或第三方的命名空间名

using System;using System.Collections;using System.ComponentModel;using System.Data;using MyCompany;using MyControls;

16.采用委托推断,不要显式实例化委托

delegate void SomeDelegate();public void SomeMethod(){ } SomeDelegate someDelegate = SomeMethod;

17.缩进至少在同一文件中要保持统一风格,注释缩进和其注释的代码在同一层次 18.所有注释要经过认真检查,不要有不明语义或者错别字 19.所有成员变量应该定义在前面,和属性或方法间空开一行

public class MyClass { int m_Number;string m_Name;

public void SomeMethod1(){ } public void SomeMethod2(){ } }

20.局部变量的定义尽可能靠近它的初次使用 21.文件名应该体现其包含的类

22.当使用partial类型且每部分分配一个文件时,以类名+逻辑部分的方式来命名文件

//MyClass.cs public partial class MyClass { } //MyClass.Designer.cs public partial class MyClass { } 23.做大括号总是放在新行中

24.匿名方法模仿普通方法布局,但是大括号要和委托声明对其

delegate void SomeDelegate(string someString);//正确

void InvokeMethod(){ SomeDelegate someDelegate = delegate(string name){ MessageBox.Show(name);};someDelegate(“Juval”);} //错误

void InvokeMethod(){ SomeDelegate someDelegate = delegate(string name){ MessageBox.Show(name);};someDelegate(“Juval”);}

25.没有参数的匿名方法使用空括号,仅当匿名方法被用于任何委托时才可以省略括号

delegate void SomeDelegate();//正确

SomeDelegate someDelegate1 = delegate(){ MessageBox.Show(“Hello”);};//错误

SomeDelegate someDelegate1 = delegate { MessageBox.Show(“Hello”);};

26.在使用Lambda表达式时,模仿一般的方法规范。

delegate void SomeDelegate(string someString);

SomeDelegate someDelegate =(name)=> { Trace.WriteLine(name);MessageBox.Show(name);};

27.当内联Lambda表达式仅包含一个简单的语句时,应避免多语句或者返回语句出现在大括号中。可以简单使用小括号表达:

delegate void SomeDelegate(string someString);

void MyMethod(SomeDelegate someDelegate){ }

//正确

MyMethod(name=>MessageBox.Show(name));

//错误

MyMethod((name)=>{Trace.WriteLine(name);MessageBox.Show(name);});注释

编写有用的注释,不要在注释中重复写代码语义。应该编写的是解释方法和原理的说明性注释。

函数

不要在一个函数中包含太多内容,函数的功能要简单,短小,使人更容易理解,也有利于防错。

第二条 尽量在代码中不包含被警告的内容

高度重视警告:使用编译器的最高警告级别。构建尽量做到干净利落(没有警告)。理解所有的警告。通过修改代码而不是降低警告级别来排除警告。

即使程序一开始似乎能够正确运行,也还是要这样做。即使你能够肯定警告是良心的,仍然要这样做。因为良性警告的背后可能隐藏着未来指向真正危险的警告。

项目设置和项目结构

1. 总是以4级警告建立项目

2. 在发布版中将警告当作错误(注意这不是VS.NET的缺省设置)

3. 永远不要抑制特定的编译警告

4. 总是在应用程序的配置文件中显式地说明支持的运行时版本

5. 避免显式的自定义版本改向和绑定到CLR程序集

6. 不要在AssemblyInfo.cs中放任何逻辑。除了在AssemblyInfo.cs中,不要在任何文件中放程序集属性(应包括公司名称、描述、版权等)7. 所有程序集应该使用相对路径引用 8. 不允许在程序集中循环引用

9. 努力对同一逻辑应用程序中(通常是一个解决方案)的所有程序集和客户端使用统一的版本号

10.将Visual Studio.NET应用配置文件命名为App.config,并将其包括在项目中 11. 将Visual Studio.NET缺省的项目结构改为标准的布局,对项目文件夹和文件应用统一的结构 12. 一个发布版本应该包含Debug标记

第三方头文件

无法修改的库头文件可能包含引起警告的构造。如果这样,可以用自己的包含原头文件的版本将此文件包装起来,并有选择的为该作用域关闭警告,然后在整个项目的其他地方包含此包装文件。

代码中尽量不包含未使用的函数,变量

经确认确实不需要使用的函数,变量(不包括为未来使用而设的占位符),可以进行删除处理。

不要遗漏return语句

PS:例外情况

有时候编译器可能会发出一些确实无意义的警告。这些警告要经过团队确认后尽量在局部进行屏蔽,但要做出明确的注释,说明为什么必须禁用。

第三条 使用自动构建系统 第四条 使用版本控制系统

应确保每次提交的代码都可以构建成功。

第五条 定期进行代码审查

互相阅读彼此的代码不但可以尽快提高自己的编码水平,也可以相互借鉴更好的方法。

第六条 一个实体应该只有一个紧凑的职责

一次只解决一个问题:只给一个实体(变量、类、函数、名称空间、模块和库)赋予一个定义良好的职责。应该只选择目的单一的函数,小而且目的单一的类,和边界清晰的紧凑模块。

应该用较小的低层抽象构建更高层次的抽象,要避免将几个低层抽象集合成一个较大的低层次抽象聚合体。用几个简单的行为来实现一个复杂的行为,比反其道而行之更加容易。

第七条 正确,简单和清晰第一

软件简单为美:正确优于速度,简单优于复杂,清晰优于机巧,安全优于不安全。

要避免使用程序设计语言中的冷僻特性。应该使用最简单的有效技术。不要使用不必要的操作符重载

构造函数的参数,应该使用命名变量,而不要使用临时变量

这能够避免可能的声明二义性,还经常能使代码的意图更加清晰,从而更容易维护,而且也更安全。

第八条 编程中应该知道何时和如何考虑可伸缩性

当数据爆炸性增长时:不要进行不成熟的优化,如果能够证明优化必要而且非常重要,则应该集中精力改善算法的复杂性,而不是进行小型的优化,比如节省一个多余的加法运算。

为了避免未来可能遭遇到的数据处理容量上的瓶颈问题,应该预先做这些事情:

使用灵活的、动态分配的数据,不要使用固定大小的数组

那种“比现在所需要的最大数组还要大”的数组,在正确性和安全性方面都存在严重问题。只有在编译时大小固定不变的数组才是可接受的。

了解算法的实际复杂性

要留心那些不易发觉的陷阱,比如看似线性的算法实际上要调用其他线性操作,结果算法实际上是二次的。

优先使用线性算法或者尽可能快的算法 尽可能避免劣于线性复杂性的算法

如果面对的是一个O(NlogN)或者O(N²)算法,就必须花费精力寻找替代方案,只有代码才不至于在数据量显著增长的情况下陷入深度激增的性能深潭。例如:建议使用范围成员函数(通常是线性的)而不是反复调用单元素替代函数,后者会很容易在一个线性的操作要调用另一个线性操作时变成二次复杂性。永远不要使用指数复杂性的算法,除非真的别无选择

在决定接受指数算法之前,必须尽力寻找替代方案,因为对于指数算法来说,即使是数据量的有限增加,也会使算法的性能急剧下降。

总而言之,要尽可能优先使用线性(或者更好的)算法,尽可能合理的避免使用比线性算法差的多项式算法。竭尽全力避免使用指数算法。

第九条 不要进行不成熟的优化

我们将不成熟的优化定义为这样的行为:以性能为名,使设计或代码更加复杂,从而导致可读性更差,却没有经过验证的性能需求(比如实际的度量数据与目标的比较结果)作为正当理由,因此本质上对程序没有真正的好处。

因此,默认时,不要把注意力集中在如何使代码更快上;首先关注的应该是使代码尽可能的清晰和易读。

第十条 不要进行不必要的劣化

所谓不成熟的劣化一词,指的就是编写如下这些没有必要的、可能比较低效的程序:

在可以用通过引用传递的时候,却定义了通过值传递的参数 在使用前缀++操作符很合适的场合,却使用后缀版本 在构造函数中使用赋值操作而不是初始化列表

第十一条 尽量减少全局和共享数据

共享会导致冲突:避免共享数据,尤其是全局数据。共享数据会增加耦合度,从而降低可维护性,通常还会降低性能。

名字空间作用域中的对象、静态成员对象或者跨线程或跨进程共享的对象会减少多线程和多处理器环境中的并行性,往往是产生性能和可伸缩性瓶颈的源头。建议用通信方式(比如消息队列)代替数据共享。尽量降低类之间的耦合,尽量减少交互

第十二条 隐藏信息

不要泄密:不要公开提供抽象的实体的内部信息。而应该公开抽象(至少是get/set抽象),而不是数据。

数据只是抽象、概念性状态的一种可能的具体化而已。如果将注意力集中在概念而不是其表示形式上,就能够提供富于提示性的接口,并按需要对实现进行调整。比如缓存还是实时地计算,又比如使用不同的表示方式,针对某种使用模式进行优化。

绝对不要将类的数据成员设为public,仅对最需要的类型标记为public,其他的标记为internal。它同样适用于更大的实体比如程序库。模块和程序库同样应该提供定义抽象和其中信息流的接口,从而使与调用代码的通信比采用数据共享方式更安全,耦合度更低。

第十三条 尽量在编译和连接时检查错误,而不要等到运行时

运行时检查取决于控制流和数据的具体情况,这意味着很难知道检查是否彻底。相比而言,编译时检查与控制流和数据无关,一般情况下能够获得更高的可信度。

第十四条 尽量合理的使用const常量

不变的值更易于理解、跟踪和分析,所以应该尽可能地使用常量代替变量,定义值的时候,应该把常量作为默认的选项:常量很安全,在编译时会对其进行检查。尽量不要强制转换常量的类型。

例如:

const int x = 0;public const double productWeight = 11.7;private const string productName = “Visual C#”;

第十五条 避免使用语义不清的参数

要避免在代码中使用诸如42和3.14159这样的文字常量。它们本身没有提供任何说明,并且因为增加了检测的重复而使维护更加复杂。可以用符号名称和表达式替换它们,比如width*aspectRatio

名称能够增加信息,并提供单一的维护点,而程序中到处重复的原始数据是无名的,维护起来很麻烦。常量应该是枚举或者const值,有合适的作用域和名称。

重要的特定于领域的常量应该放在名字空间一级

第十六条 尽可能局部的使用变量 第十七条 避免函数过长,避免嵌套过深

过长的函数和嵌套过深的代码块的出现,经常是因为没能赋予一个函数以一个紧凑的职责所致,这两种情况通常都能够通过更好的重构予以解决。每个函数都应该是顾其名而能思其义,易于理解的工作单元,要避免将多个小概念单元合并到一个长的函数体中的做法。

一些建议:

尽量紧凑:对一个函数只赋予一种职责

不要自我重复:优先使用命名函数,而不要让相似的代码片断反复出现 优先使用&&:在可以使用&&条件判断的地方要避免使用连续嵌套的if 不要过分使用try 优先使用标准算法

不要根据类型标签(type tag)进行分支(switch)第十八条 尽量减少定义性依赖,避免循环依赖

循环依赖是指两个模块直接或者间接地相互依赖。所谓模块就是一个紧凑的发布单元,而互相依赖的多个模块并不是真正的独立模块,而是紧紧胶着在一起的一个更大的模块,因此,循环依赖有碍于模块性,是大型项目的祸根。请避免循环依赖。

第十九条 不要引用多余的资源文件 第二十条 尽量不要重载默认的操作符,至少应保证操作符的自然语义不被破坏 第二十一条 优先使用++和—的标准形式。优先调用前缀形式。第二十二条 用小类代替巨类

小类更易于编写,更易于保证正确、测试和使用。小类更有可能适用于各种不同情况。应该用这种小类体现简单概念,不要用大杂烩式的类。

第二十三条 要避免使用隐式转换

在做类型提供隐式转换之前,请三思而行,应该依赖的是显式转换。

隐式转换有两个主要的问题:

1.它们会在最意料不到的地方抛出异常

2.它们并不总是能与语言的其他元素有效地配合 第二十四条 将数据成员设为私有的,无行为的聚集

要避免将公用数据和非公用数据混合在一起,因为这几乎总是设计混乱的标志。信息隐藏是优秀软件工程的关键,应该将所有数据成员都设为私有的,这是类用来保持其不变式的最佳方式。

第二十五条 不要允许异常跨越模块边界传播

最低限度,应用程序必须在以下位置有捕获所有异常的catch(…)兜底语句,其中大多数都直接适用于模块:

1.在main函数的附近:捕获并用日志记录任何将使程序不正常终止而其他地方又没有捕获的异常。

2.在从无法控制的代码中执行回调附近3.在现场边界的附近4.在模块接口边界的附近

5.在IO,数据库连接等高危操作附近

第二十六条 如有可能,尽量用算法调用代替手工编写的循环

对非常简单的循环而言,手工编写的循环有可能是最简单也是最有效的解决方案。但是编写算法调用代替手工编写的循环,可以使表达力更强、维护性更好、更不易出错,而且同样高效。

第二十七条 编码惯例

1. 避免在一个文件中放多个类

2. 一个文件应该只对一个命名空间提供类型,避免在同一文件中有多个命名空间 3. 避免一个文件的长度超过500行(除了机器生成的代码)4. 避免方法定义超过25行

5. 避免超过5个参数的方法,使用结构传递多个参数 6. 每行应该不超过80个字符,或者10个单词 7. 不要手工编辑任何机器生成的代码

A.如果修改机器生成的代码,修改代码格式和风格以符合本编码标准 B.尽可能使用partial类以分解出需要维护的部分 8. 避免对显而易见的内容作注释

A.代码应该是自解释的,由可读性强的变量和方法组成的好的代码应该不需要注释 B.参加第一条中的注释部分

9. 仅对操作的前提、内在的算法等写文档 10. 避免方法级的文档

A.对API文档采用大量的外部文档

B.方法级注释仅作为对其他开发人员的提示 11. 决不要硬编码数值,声明一个常量是最好的选择 12. 仅对本轮就是常量的值使用const修饰符,例如一周的天数 13. 避免对只读变量使用const修饰符。在此情况下,采用readonly修饰符

public class MyClass { public const int DaysInWeek = 7;public readonly int Number;public MyClass(int someValue){ Number = someValue;} }

14.对任何假设采用assert。平均来讲,每五行代码中就有一行是断言

using System.Diagnostics;object GetObject(){} object someObject = GetObject();Debug.Assert(someObject!= null);

15. 16. 17. 每行代码都应该经过白盒测试 仅捕获已经显式处理了的异常

在抛出异常的catch语句中,总是抛出最初异常以保持最初错误的堆栈位置

catch(Exception exception){ MessageBox.Show(exception.Message);throw;}

18. 定义自定义的异常时

A.从ApplicationException继承 B.提供自定义的序列化 19. 避免采用friend程序集,因为这样增加了程序集间的耦合度 20. 避免使用依赖于从特定位置运行的程序集的代码。21. 尽量减少应用程序集(客户端EXE程序集)的代码,采用类库而不要包含业务逻辑层代码。22. 避免对枚举提供明确的值

//正确

public enum Color { Red,Green,Blue } //错误

public enum Color { Red=1,Green=2,Blue=3 }

23. 避免对枚举指定类型

//错误

public enum Color : long { Red, Green, Blue }

24. 25. 26. If语句总是使用括号,即使它只包含一句语句 避免使用?:条件运算符 避免使用(#if…#endif),应使用conditional方法代替

[Conditianal(“MySpecialCondition”] public void MyMethod(){}

27. 避免在布尔条件语句中调用函数,赋值到局部变量并检查它们的值。

bool IsEverythingOK(){} //错误

if(IsEverythingOK()){} //正确

bool ok=IsEverythingOK();if(ok){}

28.29. 总是使用从0开始的数组

总是使用一个for循环显式地初始化一个引用类型数组

public class MyClass {} const int ArraySize=100;MyClass[] array=new MyClass{ArraySize];for(int index=0;index

30. 31. 不用提供public或protected成员变量,而是使用属性 应尽量使用get/set的自动返回属性

//错误

class MyClass { int m_Number;

public int Number { get { return m_Number;} set { m_Number=value;} } } //正确

class MyClass { public int Number { get;set;} }

32. 33. 34. 35. 避免使用new,应使用override替代

在一个密封的类里总是把public和protected方法标记为virtual 永远不要使用不安全的代码 合理使用as操作符进行映射

Dog dog = new GermanShepherd();GermanSheperd shepherd = dog as GermanShepherd;if(shepherd!= null){} 36. 37.

{ 在使用一个委托前总是要先检查它是否为空(null)

不要提供公有成员变量,使用存取器(accessors)进行替代

public class MyPublisher MyDelegate m_SomeEvent;public event MyDelegate SomeEvent { add { m_SomeEvent += value;} remove { m_SomeEvent-= value;} } }

38. 避免定义事件处理委托,使用EventHandler或者GenericEventHandler进行替代 39. 使用EventsHelper安全的发布事件 40. 总是优先使用接口,但要避免一个接口只包含一个成员,包含3-5个成员较为合适。上限为12。41. 避免事件成为接口成员 42. 提供明确定义的接口描述 43. 不要假设一个接口是可以安全运作的,永远都要做好处理意外的准备

SomeType obj1;IMyInterface obj2;

obj2=obj1 as IMyInterface;if(obj2!= null){ obj2.Method1();} else { //处理可能出现的错误

}

44. 不要将可能改变的,或用于数据库连接的,或者交付给最终客户使用的任何字符串进行硬编码,要使用资源文件定义他们 45. 使用String.Empty代替””

//错误

string name = “";//正确

string name = String.Empty;

46. 47. 48.

定义长字符串的时候,应该使用StringBuilder,而不是string 永远不要使用goto语句,除非迫不得已

在switch代码块中总要包含一个default项,并且为其设置断言

int number = SomeMethod();switch(number){ case 1: Trace.WriteLine(”Case 1:“);break;case 2: Trace.WriteLine(”Case 2:“);break;default: Debug.Assert(false);break;}

49.不要使用this引用,除非某些特殊情况,比如从一个构造器中运行另外一个

//一个正确使用this的例子

public class MyClass { public MyClass(string message){} public MyClass():this(”Hello"){} }

50. 不要使用base关键词。除非你想要解决一个子类成员和基类间的名称冲突,或者运行一个基类构造器

//一个正确使用base的例子

public class Dog { public Dog(string name){} virtual public void Bark(int howLong){} } public class GermanShepherd:Dog { public GermanShepherd(string name):base(name){} public override void Bark(int howLong){ base.Bark(howLong);} }

51. 不要使用GC.AddMemortyPressure(),不要依赖HandleCollector。合理的使用Dispose()和Finalize()方法 52. 一般情况下不要使用check来检查代码(防止性能损失),但是在可能的溢出区则使用check来保持代码的安全性。安全性的优先级永远高于性能。

int CalcPower(int number,int power){ int result=1;for(int count=1;count<=power;count++){ checked { result*=number;} } return result;}

53. 在代码中要避免直接使用object数据类型(System.Object),可以使用约束或者as进行替代。

class SomeClass {} //错误

class MyClass { void SomeMethod(T t){ object temp=t;SomeClass obj=(SomeClass)temp;} } //正确

class MyClass where T: SomeClass { void SomeMethod(T t){ SomeClass obj =t;} }

54.{} 一般而言,不要在通用接口中定义约束。接口级别的约束经常会被强类型所覆盖

public class Customer //错误

public interface IList where T: Customer {} //正确

public interface ICustomerList:IList {} 第二十八条 安全

1. 总是对应用程序私有的组件,集合等使用强名,这样可以保证安全性

2. 在应用程序配置文件中使用加密算法,进行安全保护

3. 对不受控制的引用方法,要做适当的安全处理,如加入断言控制

4. 不要使用SuppressUnmanagedCodeSecurity属性 5. 不要使用/unsafe来切换TlbImp.exe的默认行为。

6. 在服务器端要使用自定义的安全规则来扩展Microsoft的默认配置,以保证更高级别的安全性

7. 为防止引诱性攻击,应修改组件级别的运行权限,限制其可能的不安全行为

8. 在编写Windows程序时,在每个Main()中都要使用相应的安全规则

jsp编码规范 篇2

关键词:C语言,软件代码,编码规范

0 引言

在软件开发过程中, 代码的质量直接影响软件产品的质量。一个合格的软件工程师的任务就是要在预定的时间和进度下交付高质量的软件产品。现在, 软件系统的规模越来越大, 复杂程度越来越高, 软件的质量也越来越重要。由于软件开发是一个思考过程, 开发人员的编程习惯和思维方式直接影响到软件产品的质量。所以在20世纪60年代才会爆发软件危机。而且人们也渐渐认识到, 在软件开发过程中, 编码不规范的积累与放大效应是导致软件危机最主要的原因。本文尝试对C语言编码规范做了个探讨。

1 排版

版式虽然不会影响程序的功能, 但会影响可读性。程序的版式追求清晰、美观, 是程序风格的重要构成因素。可以把程序的版式比喻为“书法”。好的“书法”可让人对程序一目了然, 看得兴致勃勃。差的程序“书法”如螃蟹爬行, 让人看得索然无味, 更令维护者烦恼有加。

1.1 缩进

程序块采用缩进风格编写, 缩进为4个空格位。排版不混合使用空格和TAB键。

1.2 空格

(1) 函数名之后不要留空格, 紧跟左括号‘ (’。

(2) ‘ (’向后紧跟, ‘) ’、‘, ’、‘;’向前紧跟, 紧跟处不留空格。

(3) ‘, ’之后要留空格, 如Function (int x, int y, int z) 。如果‘;’不是一行的结束符号, 其后要留空格, 如for (initialization; condition; update) 。

(4) 一元操作符如“!”、“~”、“++”、 “&” (地址运算符) 等前后不加空格。

(5) 赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符, 如“=”、“+=” “>=”、“<=”、“+”、“*”、“%”、“&&”、“‖”、“<<”, “^”等二元操作符的前后应当加空格。

(6) 象“[]”、“.”、“->”这类操作符前后不加空格。

1.3 空行

(1) 在每个类声明之后、每个函数定义结束之后都要加空行。

(2) 在一个函数体内, 逻辑上密切相关的语句之间不加空行, 其它地方应加空行分隔。

1.4 代码行

(1) 一行代码只做一件事情, 如只定义一个变量, 或只写一条语句。这样的代码容易阅读, 并且便于写注释。如不好的风格:int width, height, depth; // 宽度高度深度。

(2) if、for、while、do 等语句自占一行, 执行语句不得紧跟其后。不论执行语句有多少都要加{}。这样可以防止书写失误。

1.5 对齐

(1) 程序的分界符‘{’和‘}’应独占一行并且位于同一列, 同时与引用它们的语句左对齐。

(2) { }之内的代码块在‘{’右边数格处左对齐。

1.6 长行拆分

长表达式要在低优先级操作符处拆分成新行, 操作符放在新行之首 (以便突出操作符) 。拆分出的新行要进行适当的缩进, 使排版整齐, 语句可读。

参考文献

[1]谭浩强.C程序设计[M].北京:清华大学出版社, 2006.

jsp编码规范 篇3

Application对象为了多个应用程序保存信息,对于每个容器,每个用户都共同拥有一个application对象,服务器启动以后,会自动创建一个application对象,这个对象会一直保持到服务器关闭,

下列实例用于统计页面访问次数。

1.application.jsp

?

1

2

3

4

5

6

7

8

9

10

11

<%@ page language=java import=java.util.* pageEncoding=utf-8%>

<%

int count = 0;

String c_name = request.getParameter(c_name);

try {

count = Integer.parseInt((application.getAttribute(c_name).toString()));

} catch(Exception e){ }

out.println(自服务器启动后,此页面已经被访问了 + count +次);

count++;

application.setAttribute(c_name, new Integer(count));

%>

2.test_application.jsp

?

1

2

3

4

5

<%@ page language=java import=java.sql.* pageEncoding=utf-8 errorPage=%>

<%

String path = request.getContextPath();

String basePath = request.getScheme()+://+request.getServerName()+:+request.getServerPort()+path+/;

%>

>html;“ http-equiv=”Content-Type“ />测试计数器

jsp实验心得 篇4

学号:101405071019 姓名:李俊敏 班级:电子商务10—1 我们经过了一个学期的学习,对于JSP有了一定的初步了解。这学期我们仅仅学习了一个基础和大概。其实对于JSP,他的功能是很强大的。在学习JSP期间我们用到了两个软件。它们分别是:tomcat6.0,jdk-6u21-windows-i586,在编写JSP页面时是基于java语言的,所以要编写一个动态的JSP页面必须具备相关的知识。同时还应该注意大小写。如果制作静态的网页,我们首先要掌握HTML,特别是 HTML 布局中的table的使用,我们经常会在页面设计中用到。学习怎么将JavaScript在HTML中验证输入的Form元素。

记得老师说过HTML是非常有用的我们要自己试着手工写HTML代码,这是非常有必要的。因为到最后我们将会使用JSP和HTML进行混合的编程。制作网页仅仅是静态的当然是不行的

但应该注意多线程的编程限制,由于该servlet始终驻于内存,所以响应是非常快的。如果.jsp文件被修改了,服务器将根据设置决定是否对该文件重新编译,如果需要重新编译,则将编译结果取代内存中的servlet,并继续上述处理过程。虽然JSP效率很高,但在第一次调用时由于需要转换和编译而有一些轻微的延迟。学习体会:

1.JSP是一种表示层的技术,我认为必须熟知JSTL和EL表达式。学JSP一定要对这些脚本元素很熟悉:(1)声明脚本元素(2)表达式脚本元素

(3)scriptlet脚本元素

可以再这些脚本元素中直接插入Java代码,用于流程控制和应用逻辑,看似十分简单和方便,但恰恰这些脚本元素污染了表示层。这些脚本元素是JSP早期版本遗留下来的问题,在JSP2.0中引入了EL并结合JSTL基本上解决了上述问题,这使我们可以编出不含有脚本的JSP代码,让JSP是真正意义上是用于表示。

2.JSP实质是Servlet,究其本质来看JSP最终要编译成Java字节码即.class文件。在Tomcat下发现所有.jsp文件都被编译成.class文件,而这些类实质都是继承自Servlet。

3.java是大小写敏感的,用过其他编程语言的人最容易犯这个错误,尤其是刚上手的时候。java的调用过程都是要加括号的,一开始比较容易忽视

4.jsp中对应asp中的request.form()和request.querystring()的解决方法。

5.头疼的汉字处理问题。在其他的文章里曾说到在中文NT环境下如下语句输出会得到乱码解决方法是只要对字符串变量进行编码就可以得到正确结果。

6.在asp中经常使用到字符串判断语句,在java中String变量不是一个简单的变量而是一个类实例,不同的方法会得到不同的结果。7.在jsp中实现分页。符合搜索结果的多页呈现。8.代码要调整规范便于他人阅读,方便自己修改。

jsp实训感想 篇5

Jsp实训只有一周就结束了,觉得时间真是过的太快了!在这短暂的时间里,我们基本上实现了所有的功能,但是有些地方还不是很完善!

我在接到实训任务的时候,心里确实有一点儿的不知所措,对于MVC三层架构似懂非懂。主要还是没有理解MVC的本质和掌握MVC的核心架构。还好负责实训项目的老师把需求分析和任务计划书给我们大致做了一下,假如没有这些,恐怕我们很难在短短的四天时间里完成了。

不管说啥,JSP电信资费管理系统我们算是完成了,当然这个JSP电信资费管理系统只是简单的运用,没有涉及到更复杂的数据库方面的知识,作为训练初学者是完全值得我们学习的。通过做这个JSP电信资费管理系统,首先我对MVC的设计理念有了深刻的理解解!不过其中的一些细节,还是需要我自己在以后的学习和工作中慢慢体会的!比如页面传值就得我去好好去研究的例子.通过这次实训,确实让自己受益匪浅。在实训期间,我学到了很多知识,遇到了一些困难,也看到了自己的理解存在着许多问题。测试的时候,总会遇到这样那样的问题,还有写代码时一不小心就会把字母写错,从而造成软件不能执行!所以我们在做程序时一定要细心在信心!当前的软件的功能日趋复杂,知识达不到一定的深度和广度是难以在实际工作中应付自如的。

在小组成员的共同努力和老师的精心指导下,我们掌握了更

丰富全面的网页编程技术和网页应用技巧,使我们真正对所学的知识融会贯通,熟练运用。再加以刻苦学习及训练,不断地开拓自己的视野,增强自己的实践操作技能,为以后能找到个好工作而努力。经过不到一个星期的勤奋努力,终于完成了电信资费管理系统的大部分模块.从当初领到题目到最后调试完成,经历了无数次的错误->修改代码->预览网页->再修改->再预览的过程,感觉到平时学的知识是多么的浅薄,在当时真是体验的真真切切.本来已经耳熟能详的代码,一到电脑中书写,不是打错,就是忘记符号 ,这充分的反应了我的动手能力还很差,常用代码还不够熟练.给我以后的学习敲响了警钟。

通过这次实训,我也感受到了网络的强大,遇到什么问题,上网一查,就知道该怎么做了。我们可以在网上请教一些高手,向他们提出问题,让他们来给我们解决,通过不断的互相学习,共同进步这个过程,我们的水平会得到很大的提高!

这次实训是我离开学校前的为数不多的非常好的演练和实践机会,是对我培养独立思考问题和自学能力的锻炼,让我意识到必须努力学习才能在团队合作中中体现自己的价值,以及自己的优点,以适应社会的需要.姓名:王阳博

班级:JAVA-08-1

学号:200813100146

jsp试题及答案 篇6

一、填空

1、Tomcat服务器的默认端口是8080。怎样修改tomcat的端口__在Tomcat下打开conf文件夹找到server.xml文件用记事本打开在中把8080更改即可_____,

2、异常的处理,可在该方法的代码段中包含3类代码:try、catch和finally代码块。

3、jsp主要内置对象有:application、exception、pageContext、request、session、_____response_____out、config、page。

4、理论上,GET是用于获取服务器信息并将其作为响应返回给客户端,POST是用于客户端把数据传送到服务器。

5、application对象是代表应用程序上下文,它允许JSP页面与包括在同一应用程序中的任何Web组件共享信息,而session对象则是每个客户专用的。

6、JDBC的主要任务是:与数据库建立连接、发送SQL语句、处理结果。

7、一个Bean由三部分组成:实现Java.io.serializable接口、提供无参数的构造方法、提供getter()和setter()方法访问它的属性。

8、JavaServlet的主要特点是:、方便、、、节省投资。运行servlet需要在___web.xml_____注册.

9、Servlet的生命周期分三个时期:装载Servlet、创建一个Servlet实例、销毁。

10、JSP开发网站的两种模式分为_____jsp+javabean___________和jsp+javabean+servlet。

二、选择题

1、下面哪一个不是JSP本身已加载的基本类?(b)

A、java.lang.*B、java.io.*C、javax.servlet.*D、javax.servlet.jsp.*

2、对于预定义<%!预定义%>的说法错误的是:(c)

A、一次可声明多个变量和方法,只要以“;”结尾就行B、一个声明仅在一个页面中有效

C、声明的变量将作为局部变量D、在预定义中声明的`变量将在JSP页面初始化时初始化

3、从“员工”表的“姓名”字段中找出名字包含“玛丽”的人,下面哪条select语句正确:(D)

A、Select * from员工where姓名=’_玛丽_’B、Select * from员工where姓名=’%玛丽_’

C、Select * from员工where姓名like ‘_玛丽%’D、Select * from员工where姓名like ‘%玛丽%’

4、下述选项中不属于JDBC基本功能的是:(D)

A.与数据库建立连接B.提交SQL语句C.处理查询结果D.数据库维护管理

5、在JSP中使用标记时,不会出现的属性是:(c)

A.nameB.propertyC.valueD.以上皆不会出现

6、Page指令用于定义JSP文件中的全局属性,下列关于该指令用法的描述不正确的是:(D)

A.<%@ page=”“>作用于整个JSP页面。

B.可以在一个页面中使用多个<%@ page=”“>指令。

C.为增强程序的可读性,建议将<%@ page=”“>指令放在JSP文件的开头,但不是必须的。

D.<%@ page=”">指令中的属性只能出现一次。

7、在JSP中调用JavaBean时不会用到的标记是:(A)

A.B.C.D.

8、关于JavaBean正确的说法是:(A)

A、Java文件与Bean所定义的类名可以不同,但一定要注意区分字母的大小写

B、在JSP文件中引用Bean,其实就是用语句

C、被引用的Bean文件的文件名后缀为.java

D、Bean文件放在任何目录下都可以被引用

9、Servlet程序的入口点是:(A)

A、init()B、main()C、service()D、doGet()

10、不能在不同用户之间共享数据的方法是(A)

A、通过cookieB、利用文件系统C、利用数据库D、通过ServletContext对象

三、问答题

1.jsp有哪些内置对象?作用分别是什么?

application对象代表应用程序上下文,它允许JSP页面与包括在同一应用程序中的任何Web组件共享信息。

Config对象允许将初始化数据传递给一个JSP页面

Exception对象含有只能由指定的JSP“错误处理页面”访问的异常数据。

Out对象代表提供输出流的访问

Page对象代表JSP页面对应的Servlet类实例

PageContext对象是Jsp页面本身的上下文,它提供唯一一组方法来管理具有不同作用域的属性

Request对象提供对Http请求数据的访问,同时还提供用于加入特定请求数据的上下文

Response对象允许直接访问HttpServletResponse对象

Session对象可能是状态管理上下文中使用最多的对话

2.jsp有哪些动作?作用分别是什么?

操作被用来以“名—值”队的形式为其他标签提供附加信息

操作允许在请求是在现成的JSP页面里包含静态或者动态资源

操作允许将请求转发到另一个JSP、servlet或静态资源文件

标签用来在JSP页面中创建一个JavaBean实例并指定他的名字以及作用范围

此操作和setBean一起协作,用来设置JavaBean的属性

操作是对操作的补充,用来访问一个Bean的属性

用来产生客户端浏览器的特别标签,可以使用它来插入Applet和JavaBean

3.JSP中动态INCLUDE与静态INCLUDE的区别?

如果文件仅仅是静态文件,那么这种包含仅仅是把包含文件的内容加到JSP文件中去,但这个被包含文件不会被JSP编译器执行。相反,如果这个被包含文件是动态的文件,那么他将被JSP编译器执行。如果是动态文件还可以用传递参数

4.两种跳转方式分别是什么?有什么区别?

操作允许在请求是在现成的JSP页面里包含静态或者动态资源

操作允许将请求转发到另一个JSP、servlet或静态资源文件

5.servlet运行的生命周期图.

装载Servlet

Servlet类Servlet初始化(调用init方法)

实例对象被回收提供服务(调用Service方法)

销毁Servlet实例(调用destroy方法)

6.在程序里怎样注册servlet.

displayChart

org.jfree.chart.servlet.DisplayChart

displayChart

JSP内置对象讲解教案 篇7

在JSP中预先定义好了一些常用的对象,在Web应用中可以直接使用这些对象。内置对象的应用大大简化了Web开发工作。

5.1 JSP内置对象概述

因为java是区分大小写的,所以在JSP中对象名要注意字母的大小写。

JSP内置对象有9个  request对象  response对象  out对象  session对象  application对象  exception对象  page对象

 pageContext对象  config对象

5.2 request对象

 request对象用于接收客户端通过HTTP协议传送给服务器端的数据。

 而response对象主要用来向客户发送信息,它包含了Web服务器对客户的响应信息。

 request和response对象是JSP中很重要的两个内置对象,是实现客户端和服务器交互的基础。

5.2.1 request对象的功能

 request对象用来接收客户端提交的请求

例如:接收用户提交的表单信息

在xxx.jsp文件中需要用request对象接收表单信息。request对象用的比较多的方法是getParameter()方法

5.2.2 getParameter方法

 request对象的getParameter()方法根据指定的参数,获取客户端提交的信息。 其语法规则如下:

<% String name=request.getParameter(“txtName”)%>

其中,name是一个字符串变量。txtName是客户端提交信息中的一个字段名。

5.2.3获取客户提交信息案例 【例5.1】 request对象应用。

 提交页面上有两个文本框,在文本框中输入姓名和电话号码,单击“提交”按钮后,由服务器端应用程序接收提交的表单信息并显示出来。

 其中的infoInput.html为用户的输入页面,提交的信息由服务器端的文件infoReceive.jsp接收并显示。

infoInput.html页面主要代码:

姓名:


电话:


infoReceive.jsp代码

<% String str1=request.getParameter(“RdName”);%> <% String str2=request.getParameter(“PhName”);%> 您输入的信息为:
姓名: <%=str1%>

电话: <%=str2%>
5.2.4 request对象常用方法

 在客户访问页面时,向服务器的JSP引擎提交一个HTTP请求,该请求包含一个请求行、主机头和上载信息。例如:

◦ POST /chapt5/infoReceive.jsp HTTP/1.1

//请求行 ◦ Host localhost

//头,host是头名字

 request对象也提供了一些其他方法,用来获得客户传来信息的其他部分。 request对象常用方法:

1.getProtocol():获取客户端向服务器端传送数据所使用的协议名称和版本号 2.getServerName():获得服务器的名字

3.getServerPort():获得服务器所使用的端口号。4.getRemoteAddr():获得客户端的IP地址。

5.getRemoteHost():获得客户端主机的名字,若失败,则返回客户端的IP地址。6.getMethod():返回客户端向服务器端传送数据的方法,一般方法为get或post。

7.getCookies():返回客户端的cookie对象,结果是一个cookie数组。如果客户端没有发送cookie,则返回空值。

8.getSession(boolean create):返回和当前客户端请求相关联的HttpSession对象,如果当前客户端请求没有和任何HttpSession对象关联,那么当create变量为true,则创建一个HttpSession对象并返回;反之,返回null。9.getHeader(String name):获得http协议定义的传送文件头信息。

10.getAttribute(String name):返回name指定的属性值,若不存在指定的属性,就返回null。

11.getAttributeNames():返回request对象所有属性的名字,结果集是一个Enumeration(枚举)类的实例。12.getHeaderNames():返回所有request header的名字,结果集是一个Enumeration(枚举)类的实例。

13.getHeaders(String name):返回指定名字的request header的所有值,结果集是一个Enumeration(枚举)类的实例。

14.getParameter(String name):以字符串的形式返回客户端传来的某一个请求参数的值,该参数名由name指定。当传递给此方法的参数名没有实际参数与之对应时,返回null。通常是表单中的参数.15.getParameterNames():返回客户端传送给服务器端的所有的参数名,结果集是一个Enumeration(枚举)类的实例。当传递给此方法的参数名没有实际参数与之对应时,返回null。

16.getParameterValues(String name):以字符串数组的形式返回指定参数所有值。

17.getQueryString():返回查询字符串,该字符串由客户端以GET方法向服务器端传送。18.getRequestURI():获得发出请求字符串的客户端地址

19.getServletPath():获得客户端所请求的脚本文件的文件路径。

20.setAttribute(String name,Java.lang.Object o):设定名字为name的request参数值,该值由Object类型的o指定。

21.getContentLength():以字节为单位返回客户端请求的大小。如果无法得到该请求的大小,则返回-1。22.getContentType():获取客户端请求的MIME类型。如果无法得到该请求的MIME类型,那么返回-1。23.getInputStream():以二进制的形式将客户端的请求以一个ServletInputStream的形式返回。使用此方法可以获得客户端的multipart/form-data数据,可以实现文件上传。

24.isSecure():如果客户机是通过一个安全的访问方式访问的,就返回true;反之,返回false。25.getDateHeader():返回一个long类型的数据,表示客户端发送到服务器的头信息中的时间信息。26.getInitHeader():获取客户端发送到服务器端的头信息中的某一个特定的信息,并转换为int类型。27.getContextPath():返回环境路径.对于JSP来说,一般是当前Web应用程序的根目录。

28.isRequestedSessionIdValid():返回一个指示客户端请求发送Session ID是否仍然有效的布尔值。

29.isRequestedSessionIdFromCookie():返回一个指示客户端请求发送Session ID是否存在于Cookie中的布尔值。

30.isRequestedSessionIdFromURL():返回一个指示客户端请求发送Session ID是否存在于URL中的布尔值。

5.2.5 request对象常用方法应用案例

【例5.2】 使用request对象的常用方法,获取客户端提交信息的不同部分。

本例中的用户输入页面infoInput2.html只需要把例5.1的文件infoInput.html的form的action属性值改为infoReceive2.jsp即可。infoReceive2.jsp主要代码

<%

out.println(“姓名文本框提交信息:” + request.getParameter(“RdName”)+ “
”);out.println(“电话文本框提交信息:” + request.getParameter(“PhName”)+ “
”);out.println(“客户端协议名和版本号:” + request.getProtocol()+ “
”);out.println(“客户机名:” + request.getRemoteHost()+ “
”);out.println(“客户机的IP地址:” + request.getRemoteAddr()+ “
”);out.println(“客户提交信息的长度:” + request.getContentLength()+ “
”);

%> out.println(“---------
”);

out.println(“getContextPath:” +request.getContextPath()+ “
”);out.println(“requestURI=” + request.getRequestURI()+ “
”);out.println(“requestURL=” + request.getRequestURL()+ “
”);out.println(“servletPath=” + request.getServletPath()+ “
”);// getServletPath 不建议使用 因为当servlet映射成/*时 无法获得

String uri = request.getRequestURI();String servletPath = uri.substring(request.getContextPath().length());out.println(“servletPath=” + servletPath + “
”);总结:

request.getRequestURI()与request.getRequestURL()与request.getServletPath()区别

a)getRequestURI()获得的信息:/day6/servlet/RequestServlet b)getRequestURL()获得的信息:http://localhost/day6/servlet/RequestServlet c)getServletPath()获得的信息: servlet/RequestServlet

getServletPath 不建议使用

因为当servlet映射成/*时 无法获得。

d)request.getContextPath()获得的信息: /day6

那如何获取serverpath String uri = request.getRequestURI();

// /day06aaa/servlet/RequestDemo1

String servletPath = uri.substring(request.getContextPath().length());

System.out.println(“servletPath=” + servletPath);5.3 response对象

◦ ◦ 把服务器端的数据以HTTP的格式发送到客户端浏览器 它的功能和request对象的功能相反

 request对象用于得到用户提交的信息  而response对象是向用户发送信息

 两者结合起来完成动态页面的交互功能。

5.3.1 response对象的功能

 response对象提供的几种输出结果的主要方法:

◦ sendRedirect():页面重定向方法。◦ setStatus():设置状态行方法。

◦ setContentType():设置文本类型方法。

5.3.2 sendRedirect()方法

 将客户端浏览器转向新的页面,页面中重定向语句后的代码不再被执行。 它可以根据用户的不同要求转向不同的页面。 例如:防盗链。(第3章 http协议中讲解)

【例5-3】response对象的使用。

 用户在登录界面输入用户名和密码,提交后验证登录者输入的用户名和密码是否正确,根据判断结果转向不同的页面。

◦ 其中userLogin.html为用户输入界面

◦ userReceive.jsp为接收用户输入信息并判断输入是否正确页面

◦ loginCorrect.html和loginError.html分别为登录成功界面和登录失败界面。

userLogin.html页面主要代码:

姓 名:
密 码:

userReceive.jsp页面源代码:

<% String Name = request.getParameter(“RdName”);String Passwd = request.getParameter(“RdPasswd”);if(Name.equals(“Mary”)&& Passwd.equals(“123456”))

response.sendRedirect(“loginCorrect.html”);else

response.sendRedirect(“loginError.html”);%>

 需要注意的是,在实际的Web开发中,用户的信息保存在数据库中,判断用户登录时所输入的用户名和密码是否正确需要连接到数据库,和数据库中的数据进行匹配。此处为了演示sendRedirect方法的使用,简单的和常量进行比较。

5.3.3 response的状态行

1.状态行的作用

当页面出现错误时,服务器会自动响应,将相应的出错信息返回客户端。状态行包含3位数字的状态代码,代表错误的性质和处理方法。共有5类状态码,如下:

1XX(1开头的3位数):主要是实验性质的。例如101表示服务器正在升级协议。

2XX:表示请求成功。如200表示请求成功。

3XX:表示在请求满足之前应采取的进一步行动。如302请求重定向; 305表示请求必须通过代理来访问。

4XX:浏览器不能满足请求时,返回的状态码。如404表示请求的页面不存在。

5XX:服务器执行出现错误时,返回的状态码。如500表示服务器内部发生错误,不能服务。

2.setStatus()方法

程序中可以使用response对象的setStatus()方法设置状态码。在一般情况下,不需要在程序中设置状态码。页面出现问题时,服务器会自动响应,并发送相应的状态码提示用户。

 使用response.setStatus(int n)方法设置状态行

◦ 例如response.setStatus(501)取得错误信息为501的出错信息,返回该出错页面到客户端。◦ 如果状态代码为出错码,页面中 response.setStatus()后面的语句将不被执行。

[例5-4]状态行的应用

本例包含4个文件 : StatueCode.html

responde对象状态行应用案例

显示不同的状态行


href=“statusCode200.jsp”>200请求成功信息


404请求资源不可用信息


501不支持请求的部分功能

上一篇:这一刻,我被感动了作文下一篇:北京市国土局党组根据