网站主页   操作系统    网络工程    服务器    网页制作    数据库    程序开发    网络安全    办公软件   
讲座日期: 本周六下午1点30分 抢座
讲座地点: 北大青鸟马甸校区
主讲老师: 王老师 金牌讲师
讲座主题: 网络安全
讲座内容: 检测、防御、黑客信息,如何过滤不安全的网站,如何防御黑客的进攻。
订座电话: 010-82011432/33
  您当前位置:主页 > 网络学院 > 程序开发 > JSP教程 >

JSP学习经验全面总结




JSP学习经验前言

    熟悉JAVA语法很久后,迟迟才开始学习JSP.而学习JSP时,却只学了基本的用法就去学Struts和Hibernate,以致对JSP掌握得很不够。后来发现所学习的Struts框架实际上是“包装”了的JSP.所以,我在学习框架的时候也回头看看JSP.

    以后应该不会再去专门学习JSP了。现在把一些JSP学习经验总结下,记录下来,以防来日忘了。

    说明:以下所描述的环境是jdk1.5、tomcat5.5、 jsp2.0、 servlet2.4、JSTL1.1.2

    一、基本配置

    基本的重要的配置在web.xml 文件中。

    1、Jsp属性组

<jsp-property-group>
<url-pattern>/pages/*url-pattern>
<el-ignore>trueel-ignore>
<page-encoding>UTF-8page-encoding>
<include-prelude>/include/header.jspfinclude-prelude>
<include-coda>/include/copyright.jspfinclude-coda>
jsp-property-group>
 


    这个设置可以指定页面编码,页头页脚等等。

    设置 UTF-8 的好处是不用在每个页面像这样指定编码

    而设置 /include/header.jspf 使得每个页面都在头部包含header.jspf文件(通常把对标签的包含放在这里)。

    2、数据库资源的引用

<resource-ref>
<description>CourseDesignJDNIdatasourcedescription>
<res-ref-name>jdbc/testres-ref-name>
<res-type>javax.sql.DataSourceres-type>
<res-auth>Containerres-auth>
resource-ref> 


    前提是要在TOMCAT的中配置

<ContextpathContextpath="/Course"docBase="Course"debug=
"0"crosscontext="true"reloadable="true">
<ResourcenameResourcename="jdbc/test"auth=
"Container"type="javax.sql.DataSource"
maxActive="100"maxIdle="30"maxWait="10000"
username="root"password="123456"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/databaseName?
useUnicode=true&characterEncoding=UTF-8"/>
Context> 


    在程序中可以这样获取连接

publicstaticConnectiongetConnection()
...{Connectionconn=null;
try
...{
ContextinitContext=newInitialContext();
ContextenvContext=(Context)initContext.lookup"java:/comp/env");
DataSourceds=(DataSource)envContext.lookup"jdbc/test");
conn=ds.getConnection();
}
catch(Exceptione)...{
}
returnconn;



    3、过滤器

    一般来说,字符编码的处理,我们会写一个过滤器。这个过滤器的JAVA类在TOMCAT的例子中有提供,可以按需来更改再拿来用。只要在配置文件中设置:

<filter-name>setCharacterEncodingfilter-name>
<filter-class>powerwind.filter.SetCharacterEncodingFilterfilter-class>
<init-param>
<param-name>encodingparam-name>
<param-value>UTF-8param-value>
init-param>
filter>
<filter-mapping>
<filter-name>setCharacterEncodingfilter-name>
<url-pattern>/pages/*url-pattern>
filter-mapping>
 


    4、标签的URI

    JSTL是个东西,里面提供了很好用的标签(Tag),但也不一定满足我们的要求,就自己写标签了。把 *.tld 文件直接放到WEB-INF下,在自己定义的tld文件中加上元素,如:http://powerwind/course .

    5、日志

    只用过log4j这个日志包。首先是配置文件 log4j.properties (比较完整的配置,应根据情况选择):

log4j.rootLogger=DEBUG,INFO,A1,A2,A3
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%4p[%t](%F:%L)-%m%n

log4j.appender.A2=org.apache.log4j.RollingFileAppender
log4j.appender.A2.File=../../log/test.log
log4j.appender.A2.MaxFileSize=1KB
log4j.appender.A2.MaxBackupIndex=3
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-ddhh:mm:ss}:%p%t%c-%m%n

log4j.appender.A3=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.A3.URL=jdbc:mysql://localhost:3306/log4jTest
log4j.appender.A3.driver=com.mysql.jdbc.Driver
log4j.appender.A3.user=root
log4j.appender.A3.password=123456
log4j.appender.A3.layout=org.apache.log4j.PatternLayout
log4j.appender.A3.layout.ConversionPattern=INSERTINTO
log4j(createDate,thread,level,class,message)values(’%d’,’%t’,’%-5p’,’%c’,’%m’)
 


    接着写个Servlet来加载log4j:

packagepowerwind.servlet;
importorg.apache.log4j.Logger;
importorg.apache.log4j.PropertyConfigurator;

importjavax.servlet.*;
importjavax.servlet.http.*;

publicclassLog4jInitextendsHttpServlet{
publicvoidinit(ServletConfigconfig)throwsServletException{
super.init(config);
Stringprefix=getServletContext().getRealPath("/");
Stringfile=getInitParameter("log4j");
System.out.println("initlog4j...");
if(file!=null){
PropertyConfigurator.configure(prefix+file);
}else
{
PropertyConfigurator.configure(prefix+"log4j.properties");}
}
}
 


    然后同时要在web.xml下配置:

<servlet>
<servlet-name>log4jInitservlet-name>
<servlet-class>powerwind.servlet.Log4jInitservlet-class>
<init-param>
<param-name>log4jparam-name>
<param-value>WEB-INF/classes/log4j.propertiesparam-value>
init-param>
<load-on-startup>1load-on-startup>
servlet>
 


    小型的应用中,我们并不常需要国际化。但是,如果网站要中文版和英文版的话,这个就不错啦。使用时很简单,把资源test_zh_CN.properties文件放到classes目录下,然后用JSTL的fmt标签调用。

    其中var和scope属性不是必需的。三者结合,就可以实现国际化了。

<fmt:setLocalevaluefmt:setLocalevalue="zh_CN"scope=”session”/>
<fmt:setBundlebasenamefmt:setBundlebasename="test"scope=”session”var=”hehe”/>
<fmt:messagekeyfmt:messagekey="login.title"bundle=”${hehe}”scope=”session”/> 


    二、极限与安全

    资源放在WEB-INF下是安全的,因为这个目录对于客户端是不存在的。权限控制并不是仅仅这样就可以了。如果只是简单地判断用户是否登录,可用一个过滤器检查Session对象即可。若需要级别控制的话,就在Session中保存级别信息,然后加以判断。

    一般把权限的控制做成一个标签(tag)。如:

publicintdoEndTag()throwsJspException{
HttpSessionsession=pageContext.getSession();
if((session!=null)&&(session.getAttribute("user")!=null)){
Stringt=((UserBean)session.getAttribute("user")).getType();
if(t==null||role==null){
invalid();
return(SKIP_PAGE);
}
String[]roleroles=role.split(delimiter);
for(inti=0;i<roles.length;i++){
if(roles[i].equalsIgnoreCase(role))
return(EVAL_PAGE);
}
}else{
invalid();
return(SKIP_PAGE);
}
return(EVAL_PAGE);



    三、上传与下载

    上传的话,一般使用已有的组件,如commons-fileupload 或者欧莱礼的cos (可能会遇到中文编码的问题)。而下载,比较简单,就自己写了个Servlet.

publicvoidhandleRequest(HttpServletRequestrequest,
HttpServletResponseresponse)throwsIOException,ServletException{
Stringname=request.getParameter("name");
Stringtype=request.getParameter("type");
Stringdir=request.getParameter("dir");
if(name==null||name.length()<2||dir==null||dir.
length()<1||type==null||type.length()<1){
thrownewServletException("Sorry,erroroccured");
}
charch=dir.charAt(dir.length()-1);
if(ch!=’/’||ch!=’\’)
dirdir=dir+"/";
ServletOutputStreamos=null;
BufferedInputStreambis=null;
try{
Filefile=newFile(dir+name);
if(!file.exists()||file.length()>=Integer.MAX_VALUE){
logger.error("Invalidfileorfiletolarge,file:"+name);
thrownewServletException(
"Invalidfileorfiletolarge,file:"+name);
}
response.setContentType("application/"+type);
response.addHeader("Content-Disposition","attachment;filename="+name);
response.setContentLength((int)file.length());
os=response.getOutputStream();
bis=newBufferedInputStream(newFileInputStream(file));
intsize=-1;
while((size=bis.read())!=-1)
os.write(size);
}catch(IOExceptionioe){
thrownewServletException(ioe.getMessage());
}finally{
if(os!=null)
os.close();
if(bis!=null)
bis.close();
}



    以上只是个示例程序纪录在JSP学习经验中,灵活与方便的做法应该是在Servlet初始化参数()设置下载文件所在目录,当然也可以在页面中设置参数。甚至可以做成一个下载标签,方便使用。

上一篇:带参数方法调用JSP EL表达式  
下一篇:利用JBuilder 2005 开发Spring
相关信息:

·初学Java的备忘录 ·浅析Java中Data类的应用
·Java数据库存取技术 ·Java线程模型缺陷
·基于JNDI的应用程序开发 ·掌握JDK1.5枚举类型
·Java布局管理器使用方法 ·JDK 1.5之Generics
·Java数据库编程中的技巧 ·Java代码构建一个线程池

Copyright © 2002-2015 版权所有
学校地址:北京市海淀区西三旗建材城中路29号北大青鸟
招生热线:010-82011433/32 京公网安备110102004704  京ICP备05043413号 京公网安备110102004704