<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    性格決定命運,氣度影響格局
    posts - 20, comments - 18, trackbacks - 0, articles - 1
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    JSP學習總結 轉載

    Posted on 2007-08-12 14:35 尚愛軍 閱讀(216) 評論(0)  編輯  收藏

    說明:以下所描述的環境是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>true</el-ignore>
    <page-encoding>UTF-8</page-encoding>
    <include-prelude>/include/header.jspf</include-prelude>
    <include-coda>/include/copyright.jspf</include-coda>
    </jsp-property-group>
    這個設置可以指定頁面編碼,頁頭頁腳等等。
    設置 <page-encoding>UTF-8</page-encoding> 的好處是不用在每個頁面像這樣指定編碼:<%@page c %>
    而設置 <include-prelude>/include/header.jspf</include-prelude> 使得每個頁面都在頭部包含header.jspf文件(通常把對標簽的包含放在這里)。

    2、數據庫資源的引用
    <resource-ref>
    <description>CourseDesign JDNI datasource</description>
    <res-ref-name>jdbc/test</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
    </resource-ref>
    前提是要在TOMCAT的中配置
    <Context path="/Course" docBase="Course" debug="0" crossc reloadable="true">
    <Resource name="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>
    在程序中可以這樣獲取連接
    public static Connection getConnection()
    ...{
    Connection conn=null;
    try
    ...{
    Context initContext = new InitialContext();
    Context envContext = (Context)initContext.lookup("java:/comp/env");
    DataSource ds = (DataSource)envContext.lookup("jdbc/test");
    conn = ds.getConnection();
    }catch(Exception e)...{ }
    return conn;
    }
    3、過濾器
    一般來說,字符編碼的處理,我們會寫一個過濾器。這個過濾器的JAVA類在TOMCAT的例子中有提供,可以按需來更改再拿來用。只要在配置文件中設置:
    <filter-name>setCharacterEncoding</filter-name>
    <filter-class>powerwind.filter.SetCharacterEncodingFilter</filter-class>
    <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
    </init-param>
    </filter>

    <filter-mapping>
    <filter-name>setCharacterEncoding</filter-name>
    <url-pattern>/pages/*</url-pattern>
    </filter-mapping>
    4、標簽的URI
    JSTL是個東西,里面提供了很好用的標簽(Tag),但也不一定滿足我們的要求,就自己寫標簽了。把 *.tld 文件直接放到WEB-INF下,在自己定義的tld文件中加上<uri>元素,如:<uri> http://powerwind/course</uri> 。

    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-dd hh: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 = INSERT INTO log4j (createDate, thread, level, class, message) values('%d', '%t', '%-5p', '%c', '%m')
    接著寫個Servlet來加載log4j:

    package powerwind.servlet;

    import org.apache.log4j.Logger;
    import org.apache.log4j.PropertyConfigurator;

    import javax.servlet.*;
    import javax.servlet.http.*;

    public class Log4jInit extends HttpServlet {
    public void init(ServletConfig config) throws ServletException {
    super.init(config);
    String prefix = getServletContext().getRealPath("/");
    String file = getInitParameter("log4j");
    System.out.println("init log4j...");
    if (file != null){
    PropertyConfigurator.configure(prefix+file);
    }else
    {
    PropertyConfigurator.configure(prefix+"log4j.properties");
    }
    }
    }
    然后同時要在web.xml下配置:

    <servlet>
    <servlet-name>log4jInit</servlet-name>
    <servlet-class>powerwind.servlet.Log4jInit</servlet-class>
    <init-param>
    <param-name>log4j</param-name>
    <param-value>WEB-INF/classes/log4j.properties</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    </servlet>
    6、國際化

    #test_zh_CN.properties
    #login page
    login.title=登錄頁面
    小型的應用中,我們并不常需要國際化。但是,如果網站要中文版和英文版的話,這個就不錯啦。使用時很簡單,把資源test_zh_CN.properties文件放到classes目錄下,然后用JSTL的fmt標簽調用。
    <fmt:setLocale value="zh_CN" scope=”session” />
    <fmt:setBundle basename="test" scope=”session” var=”hehe” />
    <fmt:message key="login.title" bundle=”${hehe}” scope=”session” />
    其中var和scope屬性不是必需的。三者結合,就可以實現國際化了。

    二、極限與安全
    資源放在WEB-INF下是安全的,因為這個目錄對于客戶端是不存在的。權限控制并不是僅僅這樣就可以了。如果只是簡單地判斷用戶是否登錄,可用一個過濾器檢查Session對象即可。若需要級別控制的話,就在Session中保存級別信息,然后加以判斷。
    一般把權限的控制做成一個標簽(tag)。如:
    public int doEndTag() throws JspException {
    HttpSession session = pageContext.getSession();
    if ((session != null) && (session.getAttribute("user") != null)) {
    String t = ((UserBean) session.getAttribute("user")).getType();
    if (t == null || role == null) {
    invalid();
    return (SKIP_PAGE);
    }
    String[] roles = role.split(delimiter);
    for (int i = 0; i < roles.length; i++) {
    if (roles.equalsIgnoreCase(role))
    return (EVAL_PAGE);
    }
    } else {
    invalid();
    return (SKIP_PAGE);
    }
    return (EVAL_PAGE);
    }
    三、上傳與下載

    上傳的話,一般使用已有的組件,如commons-fileupload 或者歐萊禮的cos (可能會遇到中文編碼的問題)。而下載,比較簡單,就自己寫了個Servlet。
    public void handleRequest(HttpServletRequest request,
    HttpServletResponse response) throws IOException, ServletException {
    String name = request.getParameter("name");
    String type = request.getParameter("type");
    String dir = request.getParameter("dir");
    if (name == null || name.length() < 2 || dir == null || dir.length() < 1 || type == null || type.length() < 1) {
    throw new ServletException("Sorry,error occured");
    }
    char ch = dir.charAt(dir.length() - 1);
    if (ch != '/' || ch != '\')
    dir = dir + "/";
    ServletOutputStream os = null;
    BufferedInputStream bis = null;
    try {
    File file = new File(dir + name);
    if (!file.exists() || file.length() >= Integer.MAX_VALUE) {
    logger.error("Invalid file or file to large,file: " + name);
    throw new ServletException(
    "Invalid file or file to large,file: " + name);
    }
    response.setContentType("application/" + type);
    response.addHeader("Content-Disposition", "attachment; filename="+ name);
    response.setContentLength((int) file.length());
    os = response.getOutputStream();
    bis = new BufferedInputStream(new FileInputStream(file));
    int size = -1;
    while ((size = bis.read()) != -1)
    os.write(size);
    } catch (IOException ioe) {
    throw new ServletException(ioe.getMessage());
    } finally {
    if (os != null)
    os.close();
    if (bis != null)
    bis.close();
    }
    }
    以上只是個示例程序,靈活與方便的做法應該是在Servlet初始化參數(<init-param>)設置下載文件所在目錄,當然也可以在頁面中設置參數。甚至可以做成一個下載標簽,方便使用

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲最大天堂无码精品区| 亚洲ⅴ国产v天堂a无码二区| 亚洲中字慕日产2020| 午夜精品免费在线观看| 亚洲VA中文字幕无码一二三区 | 亚洲无吗在线视频| 免费A级毛片无码免费视| 精品亚洲国产成人| 免费中文熟妇在线影片| 亚洲日韩一区二区三区| 宅男666在线永久免费观看| 麻豆亚洲AV成人无码久久精品 | 性色av极品无码专区亚洲| 国产又大又长又粗又硬的免费视频| 亚洲欧美日韩中文字幕在线一区| 曰皮全部过程视频免费国产30分钟| 亚洲国产成人AV网站| 久久久久噜噜噜亚洲熟女综合| 久久精品无码专区免费| 亚洲天堂中文资源| 久久WWW免费人成人片| 免费人成大片在线观看播放| 亚洲伊人久久大香线蕉综合图片| 无码国产精品一区二区免费式芒果 | 青青草97国产精品免费观看| 亚洲开心婷婷中文字幕| 24小时日本韩国高清免费| 亚洲综合色区中文字幕| 亚洲av高清在线观看一区二区| 9久久免费国产精品特黄| 日韩精品一区二区亚洲AV观看| 最近免费中文字幕大全视频 | 亚洲精品无码成人| 在线精品亚洲一区二区小说| 久久国产乱子伦免费精品| 亚洲精品国产综合久久久久紧| 亚洲天堂中文字幕在线| 日本免费一区二区三区四区五六区 | 亚洲国产成人久久综合一 | 暖暖免费高清日本中文| 两个人看的www免费视频中文|