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

          說(shuō)明:以下所描述的環(huán)境是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>
          這個(gè)設(shè)置可以指定頁(yè)面編碼,頁(yè)頭頁(yè)腳等等。
          設(shè)置 <page-encoding>UTF-8</page-encoding> 的好處是不用在每個(gè)頁(yè)面像這樣指定編碼:<%@page c %>
          而設(shè)置 <include-prelude>/include/header.jspf</include-prelude> 使得每個(gè)頁(yè)面都在頭部包含header.jspf文件(通常把對(duì)標(biāo)簽的包含放在這里)。

          2、數(shù)據(jù)庫(kù)資源的引用
          <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、過(guò)濾器
          一般來(lái)說(shuō),字符編碼的處理,我們會(huì)寫(xiě)一個(gè)過(guò)濾器。這個(gè)過(guò)濾器的JAVA類(lèi)在TOMCAT的例子中有提供,可以按需來(lái)更改再拿來(lái)用。只要在配置文件中設(shè)置:
          <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、標(biāo)簽的URI
          JSTL是個(gè)東西,里面提供了很好用的標(biāo)簽(Tag),但也不一定滿(mǎn)足我們的要求,就自己寫(xiě)標(biāo)簽了。把 *.tld 文件直接放到WEB-INF下,在自己定義的tld文件中加上<uri>元素,如:<uri> http://powerwind/course</uri>

          5、日志
          只用過(guò)log4j這個(gè)日志包。首先是配置文件 log4j.properties (比較完整的配置,應(yīng)根據(jù)情況選擇):
          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')
          接著寫(xiě)個(gè)Servlet來(lái)加載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");
          }
          }
          }
          然后同時(shí)要在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、國(guó)際化

          #test_zh_CN.properties
          #login page
          login.title=登錄頁(yè)面
          小型的應(yīng)用中,我們并不常需要國(guó)際化。但是,如果網(wǎng)站要中文版和英文版的話,這個(gè)就不錯(cuò)啦。使用時(shí)很簡(jiǎn)單,把資源test_zh_CN.properties文件放到classes目錄下,然后用JSTL的fmt標(biāo)簽調(diào)用。
          <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屬性不是必需的。三者結(jié)合,就可以實(shí)現(xiàn)國(guó)際化了。

          二、極限與安全
          資源放在WEB-INF下是安全的,因?yàn)檫@個(gè)目錄對(duì)于客戶(hù)端是不存在的。權(quán)限控制并不是僅僅這樣就可以了。如果只是簡(jiǎn)單地判斷用戶(hù)是否登錄,可用一個(gè)過(guò)濾器檢查Session對(duì)象即可。若需要級(jí)別控制的話,就在Session中保存級(jí)別信息,然后加以判斷。
          一般把權(quán)限的控制做成一個(gè)標(biāo)簽(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 (可能會(huì)遇到中文編碼的問(wèn)題)。而下載,比較簡(jiǎn)單,就自己寫(xiě)了個(gè)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();
          }
          }
          以上只是個(gè)示例程序,靈活與方便的做法應(yīng)該是在Servlet初始化參數(shù)(<init-param>)設(shè)置下載文件所在目錄,當(dāng)然也可以在頁(yè)面中設(shè)置參數(shù)。甚至可以做成一個(gè)下載標(biāo)簽,方便使用

          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 张家界市| 明光市| 安多县| 长寿区| 广东省| 双流县| 府谷县| 东乡族自治县| 固始县| 铜鼓县| 池州市| 行唐县| 东兴市| 新邵县| 土默特右旗| 始兴县| 奉贤区| 绥阳县| 石城县| 白朗县| 青阳县| 宁明县| 定州市| 江川县| 吉林省| 奉新县| 合阳县| 浦东新区| 莆田市| 陆良县| 措勤县| 海安县| 寿宁县| 紫金县| 惠来县| 渝北区| 延寿县| 盐城市| 九龙城区| 广平县| 黔西县|