BlogJava 联系 聚合 管理  

Blog Stats

随笔档案

文章档案

Infernu的Google site


Infernus-JXH

2009年10月24日 #

此文主要是实现不处理标签库的自定义标签,步骤如下:
首先写一个类,继承TagSupport,重写doStartTag(),doEndTag()如果要处理标签体,需要重写doAfterBody()。
public class MyFirstTag extends TagSupport {
    
private String format = "yyyy.MM.dd hh:mm:ss";

    @Override
    
public int doStartTag() throws JspException {
        JspWriter out 
= pageContext.getOut();
        SimpleDateFormat sdf 
= new SimpleDateFormat(format);
        
try {
            out.println(
"<table border='1'><tr><td bgcolor='blue'>");
            out.println(
"<font color='yellow' size='7'>");
            out.println(sdf.format(
new java.util.Date()));
            out.println(
"</font>");
            out.println(
"</td></tr></table>");
        }

        
catch (IOException e) {
            e.printStackTrace();
        }

        
return SKIP_BODY;    //跳过标签体[不需要处理标签的标签体]
    }

    
    
public void setFormat(String format){
        
this.format = format;
    }

    
}
其次,配置tld文件(标签库描述文件):

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version
="2.0"><!-- 上面这段可以从JSTL里COPY -->
    
    
<description>My First Custom Tag Library</description><!-- 叙述 -->
    
<display-name></display-name><!-- 显示的名字 -->
    
<tlib-version>1.0</tlib-version><!-- 版本 -->
    
<short-name>MFCTL</short-name><!-- 短的名字 -->
    
<uri>cj</uri><!-- 全局唯一的uri,一般为"http:// ",此文只做示例,太短的话容易重复。与下文web.xml的配置应一致  -->
    
    
<tag>
        
<name>time</name><!-- 调用的名字,如<前缀:time/> -->
        
<tag-class>com.tsinghuait.tags.MyFirstTag</tag-class><!-- 具体的类 -->
        
<body-content>empty</body-content><!-- 标签体内容可以为空 -->
    
</tag>
    

然后,配置web.xml,告诉服务器有这么一个标签库。
    <jsp-config>
        
<taglib>
            
<taglib-uri>cj</taglib-uri><!-- 全局唯一的uri -->
            
<taglib-location>/WEB-INF/tld/Mytag.tld</taglib-location><!-- 标签库的描述文件位置 -->
        
</taglib>
    
</jsp-config>

最后,写一个页面用<%@taglib %>指令给定前缀和uri,调用标签。
<%@taglib prefix="lh" uri="cj"%>

<lh:time/>

posted @ 2009-11-27 10:11 Infernus 阅读(148) | 评论 (0)编辑 收藏

        作为服务器,安全是首要的问题。在WebRoot下页面用户可以直接输入地址访问,而每个页面都配置安全选项又太不现实。而在Tomcat有一个安全的目录,直接拒绝用户使用地址栏访问,那就是WebRoot\WEB-INF。然而在此目录下的页面又不能直接进行跳转,默认的跳转目录是WebRoot。这时我们就需要写导航,具体方法如下:
        这是一个网页登陆页面index.jsp:        

<center>
    
<form action="/review/login" method="post"><!-- 提交到的页面不能直接写成/WEB-INF/login.jsp或者login.jsp,要写成"工程/配置的name" -->
            
<table border="0" cellspacing="20">
            
<tr>
                
<td>
.
                
</td>
            
</tr>
        
</table>
    
</form>
    
</center>
然后在WEB-INF/web.xml下配置如下:
<servlet>
        
<servlet-name>login</servlet-name><!-- name -->
        
<jsp-file>/WEB-INF/login.jsp</jsp-file><!-- 具体的文件地址 -->
    
</servlet>
    
    
<servlet-mapping>
        
<servlet-name>login</servlet-name>
        
<url-pattern>/login</url-pattern><!-- 地址栏显示的URL -->
    
</servlet-mapping>
posted @ 2009-11-27 09:39 Infernus 阅读(1910) | 评论 (0)编辑 收藏

1.手动设置数据源:
<%@ page pageEncoding="GBK"%>
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jstl/sql" prefix="sql" %>

<!-- 手动设置数据源 dataSource="url, Driver, username, password"-->
<sql:setDataSource dataSource=
    "jdbc:mysql://localhost:3306/myweb, com.mysql.jdbc.Driver, root, lovejack"
 
    var
="myds" scope="application"/>

<!-- 查询代码 -->
<sql:query var="items" dataSource="${myds}" 
    sql
="SELECT * FROM t_items where price <= ? and price >= ?">
    
<sql:param value="20"/>
    
<sql:param value="10"/>
</sql:query>

<!-- 制表显示-->
<table border="1">
    
<tr>
        
<th>商品名称</th>
        
<th>商品价格</th>
    
</tr>
    
<c:forEach var="row" items="${items.rows}">
        
<tr>
            
<td><c:out value="${row.name}"/></td>
            
<td><c:out value="${row.price}"/></td>
        
</tr>
    
</c:forEach>
</table>
 2.在web.xml文件中配置了数据源:
<%@page pageEncoding="GBK"%>
<%@taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<%@taglib uri="http://java.sun.com/jstl/sql" prefix="sql" %>

<!-- 在web.xml文件中配置了数据源 -->
<sql:query var="items">
    SELECT * FROM t_items
</sql:query>

<table border="1">
    
<tr>
        
<th>商品名称</th>
        
<th>商品价格</th>
    
</tr>
    
<c:forEach var="row" items="${items.rows}">
        
<tr>
            
<td><c:out value="${row.name}"/></td>
            
<td><c:out value="${row.price}"/></td>
        
</tr>
    
</c:forEach>
</table>

    WEB-INF/web.xml配置如下:
     <context-param>
        
<param-name>javax.servlet.jsp.jstl.sql.dataSource</param-name>
        
<param-value>jdbc:mysql://192.168.0.13:3306/myweb,
              com.mysql.jdbc.Driver, root, lovejack
</param-value>
    
</context-param>
    
3.访问Tomcat中配置的连接池数据源:
<%@page pageEncoding="GBK"%>
<%@taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<%@taglib uri="http://java.sun.com/jstl/sql" prefix="sql" %>

<!-- 访问Tomcat中配置的连接池数据源 -->
<sql:query var="items" dataSource="jdbc/myds">
    SELECT * FROM t_items
</sql:query>

<table border="1">
    
<tr>
        
<th>商品名称</th>
        
<th>商品价格</th>
    
</tr>
    
<c:forEach var="row" items="${items.rows}">
        
<tr>
            
<td><c:out value="${row.name}"/></td>
            
<td><c:out value="${row.price}"/></td>
        
</tr>
    
</c:forEach>
</table>
需要在Tomcat/conf/tomcat-users.xml里配置管理员:
<role rolename="admin"/>
<role rolename="manager"/>

 
<user username="jackfrued" password="lovejack" roles="admin,manager"/>
再需要在localhost/admin中使用上面的用户名,密码登录 。配置当前工工程文件的Data Source。
把url,Driver,username,password都写入Tomcat的连接池中。
posted @ 2009-11-06 14:57 Infernus 阅读(311) | 评论 (0)编辑 收藏

使用EL自定义函数的四个步骤:
1. 创建一个公开类,写公开的静态的方法;
public class MyFunctions {

    
public static String reverse(String s) {
        String rs 
= "";
        
for(int i = s.length() - 1; i >= 0 ; i--{
            rs 
+= s.charAt(i);
        }

        
return rs;
    }

    
    
public static double jc(int n) {
        
double result = 1.0;
        
for(int i = n; i > 1; i--{
            result 
= result * i;
        }

        
return result;
    }

}

2. 通过标签库表述文件(*.tld)描述表达式语言中要使用的函数(<function>--><name>/<function-class>/<function-signature>) // <description>hahaha...</description>为在Eclipse里的提示。
<function>
        
<description>hahaha</description>
        
<name>reverse</name>
        
<function-class>com.tsinghuait.beans.MyFunctions</function-class>
        
<function-signature>java.lang.String reverse(java.lang.String)</function-signature>
    
</function>
    
    
<function>
        
<name>jc</name>
        
<function-class>com.tsinghuait.beans.MyFunctions</function-class>
        
<function-signature>double jc(int)</function-signature>
    
</function>

3. 修改web.xml文件,通过<jsp-config>--><taglib>标签对标签库进行声明(<taglib-uri>/<taglib-location>)
  <jsp-config>
      
<taglib>
          
<taglib-uri>http://www.tsinghuait.com/el</taglib-uri>
          
<taglib-location>/WEB-INF/tld/myel.tld</taglib-location>
      
</taglib>
  
</jsp-config>

4. 在JSP页面中使用taglib指令表明使用标签库:<%@taglib prefix="..." uri="..."%>
                                                                                        ${前缀:函数名(参数列表)}
<%@page isELIgnored="false" pageEncoding="GBK"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<c:out value="Hello, world!"></c:out><br/>
<c:out value="${123 * 456}"></c:out><br/>


posted @ 2009-11-03 17:57 Infernus 阅读(236) | 评论 (0)编辑 收藏

能在jsp页面中更简单的拿取参数。注释掉的为以前的代码
<%--
    String s 
= request.getParameter("i");
    
int i = Integer.parseInt(s);
    out.println(i 
* 8);
--%>

    $
{param.i * 8}<br/><br/>
Scope未指定位置的取值方向为 page -> request -> session -> application  如果没有找到,不会影响其它信息。
<%
    request.setAttribute(
"sss""Goodbye, world!");
    session.setAttribute(
"sss""Hello, world!");
    session.setAttribute(
"kkk"100);
    application.setAttribute(
"kkk"200);
%>


$
{sss} ${kkk} <br/><br/>
$
{sessionScope.sss}  ${applicationScope.kkk}<br/><br/>
格式
${sessionScope.stu.name} ${stu.age} ${stu["sex"]}<%-- 有特殊符号需要[]--%>

posted @ 2009-11-03 17:49 Infernus 阅读(122) | 评论 (0)编辑 收藏

需要使用SmartUpload

HTML:
<form action="upload.jsp" method="post" enctype="multipart/form-data" onsubmit="return check()">
        
<input type="file" name="file" size="25"/>
        
<input type="submit" value="上传"/>
    
</form>
JSP:
<%@page pageEncoding="GBK" contentType="text/html; charset=GBK"%>
<%@page import="com.jspsmart.upload.Files"%>
<jsp:useBean id="up" class="com.jspsmart.upload.SmartUpload"/>

<%
    try {
        up.initialize(pageContext);
        up.setDeniedFilesList(
"ppt");//不允许上传的文件后缀
        up.setDeniedFilesList(
"exe");
        up.upload();
        up.save(
"/res");//res目录必须存在,即不会自动创建
        out.println(
"<h1>上传成功</h1>");
        Files files 
= up.getFiles();
        
for(int i = 0; i < files.getCount(); i++) {
            out.println(files.getFile(i).getFileName() 
+ "<br>");
        }
    }
    catch(Exception e) {
        e.printStackTrace();
        out.println(
"<h1>上传失败</h1>");
    }    
%>
posted @ 2009-10-29 22:27 Infernus 阅读(149) | 评论 (0)编辑 收藏

建立一般的流来拷贝文件:
public static void main(String[] args) throws Exception {
        FileInputStream in 
= new FileInputStream("c:\\PC.xls");
        FileOutputStream out 
= new FileOutputStream("d:\\PC1.xls");
                
        
int b;
        
while((b = in.read()) != -1{//使用b读取输入流,在不为空的情况下使用输出流写入
            out.write(b);
        }

        
        in.close();
//最后请注意关闭不使用的流
        out.close();
    }
带缓冲的流:(更有效率.)
public static void main(String[] args) throws Exception {
        FileInputStream in 
= new FileInputStream("c:\\card20.pdf");
        FileOutputStream out 
= new FileOutputStream("d:\\abc.pdf");
        FileChannel fc1 
= in.getChannel();//得到流
        FileChannel fc2 = out.getChannel();
        
        ByteBuffer buffer 
= ByteBuffer.allocate(512);//以块为单位操作
        
        
while(fc1.read(buffer) != -1{
            buffer.rewind();
            fc2.write(buffer);
            buffer.clear();
        }

        
        in.close();
        out.close();
    }
posted @ 2009-10-29 22:23 Infernus 阅读(147) | 评论 (0)编辑 收藏

package com.tsinghuait.beans;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.FileNotFoundException;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;

public class DrawImageBean {
    
    
public DrawImageBean() {
        
    }

    
    
public String drawImage(HttpServletResponse response) {
        String code 
= "";
        BufferedImage image 
= new BufferedImage(6430, BufferedImage.TYPE_INT_RGB);//内存中的图片(宽, 高,颜色)
        Graphics g = image.getGraphics();//得到画笔
        
//Add your code here and complete your image
        g.setColor(Color.WHITE);//将颜色设置为白色
        g.fillRect(00400300);//填充整个区域
        
//        g.setColor(new Color(100, 100, 100));
//        g.drawString("Hello, world", 100, 100);
        
        
for(int i = 0; i< 100; i++{//画出验证码干扰的线,防止识别软件读取进行恶意登录
            g.setColor(new Color((int)(Math.random() * 256),
                    (
int)(Math.random() * 256), (int)(Math.random() * 256)));//画笔的颜色
            int x1 = 10 + (int)(Math.random() * 54);
            
int y1 = 30 - (int)(Math.random() * 30);
            
int x2 = x1 + 10;
            
int y2 = y1 + 10;
            g.drawLine(x1, y1, x2, y2);
//位置
        }

        
        
for(int i = 0; i < 4; i++{//画出验证码
            g.setColor(new Color((int)(Math.random() * 80),
                    (
int)(Math.random() * 80), (int)(Math.random() * 80)));//颜色较深,能看得清楚些
            g.setFont(new Font("Times New Roman", Font.BOLD, 16));//字体
            String s = String.valueOf((char)('A' + (int)(Math.random() * 58)));//生成验证码,范围是所有大写到所有小写,保存到字符串s
            code += s;
            g.drawString(s, 
10 + i * 1215);
        }

                
        g.dispose();
        
try {
            ImageIO.write(image, 
"JPEG", response.getOutputStream());//得到输出流 ,保存为jpg
        }

        
catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        
catch (IOException e) {
            e.printStackTrace();
        }

        
return code;
    }

}

posted @ 2009-10-24 10:17 Infernus 阅读(179) | 评论 (0)编辑 收藏

jsp页面:

<%@page pageEncoding="GBK" %>
<%@page import="org.jfree.data.category.CategoryDataset"%>
<%@page import="org.jfree.data.general.DatasetUtilities"%>
<%@page import="org.jfree.chart.JFreeChart"%>
<%@page import="org.jfree.chart.ChartFactory"%>
<%@page import="org.jfree.chart.plot.PlotOrientation"%>
<%@page import="java.awt.Font"%>
<%@page import="org.jfree.chart.plot.CategoryPlot"%>
<%@page import="org.jfree.chart.axis.NumberAxis"%>
<%@page import="org.jfree.chart.axis.CategoryAxis"%>
<%@page import="org.jfree.chart.servlet.ServletUtilities"%>

<jsp:useBean id = "bean" class = "com.tsinghuait.beans.DbBean"/>

<%
    String[] productNames 
= bean.getProductNames();//产品名称系列
    String[] months = bean.getMonths(); //横坐标
    double[][] amounts = new double[productNames.length][months.length];//用从数据库读到productNames, months的长度做二维数组
    
    
for(int i = 0 ; i < amounts.length; i++{
        
for(int j = 0; j < amounts[0].length; j++{
            amounts[i][j] 
= bean.getAmount(productNames[i], months[j]);//利用bean的getAmount方法查到数据赋给amounts[][]
            //System.out.print(amounts[i][j] + "\t"); 
        }

        
//System.out.println();
    }

    
    CategoryDataset data 
= DatasetUtilities.createCategoryDataset(productNames, months, amounts);//(X轴数据,Y轴数据,填充柱状图所要的实际数据);

    JFreeChart chart 
= ChartFactory.createBarChart3D("农产品产量图""月份""产量",
            data, PlotOrientation.VERTICAL, 
truefalsefalse);//利用工厂模式创建JFreeChart的对象chart,使用其的createBarChart3D方法画出3D柱状图,参数如下:
                                                                //图形的标题、X轴标题、Y轴标题、data就是CategoryDataset类的实例对象、图表的方向(横/竖)、显示标题、启用热键、启用超键接。 
            
    chart.getTitle().setFont(
new Font("黑体", Font.PLAIN, 20));//此代码处理jfreeChart的中文乱码问题
    chart.getLegend().setItemFont(new Font("宋体", Font.BOLD, 12));
    CategoryPlot plot 
= (CategoryPlot) chart.getPlot();
    NumberAxis na 
= (NumberAxis) plot.getRangeAxis();
    CategoryAxis ca 
= plot.getDomainAxis();
    na.setLabelFont(
new Font("宋体", Font.PLAIN, 14));
    ca.setLabelFont(
new Font("楷体_gb2312", Font.ITALIC, 14));
    ca.setTickLabelFont(
new Font("宋体", Font.BOLD, 14));
    
    String filename 
= ServletUtilities.saveChartAsJPEG(chart, 400300, session);//创建jpg图片,并将名字保存到filename
    String url = request.getContextPath() + "/servlet/a?filename=" + filename;//使用request.getContextPath()的到主地址,做字符串连接,使用传参数的方法得到新的地址
    out.println(url);
%>

<img src="<%= url%>"/>
bean中的数据库查询
public String[] getProductNames() {
        String[] series 
= null;
        
try {
            Statement stmt 
= con.createStatement();
            ResultSet rs 
= stmt.executeQuery("select distinct name from t_product");
            rs.last();
            series 
= new String[rs.getRow()];
            rs.first();
            rs.relative(
-1);
            
for(int i = 0; rs.next(); i++{
                series[i] 
= rs.getString(1);
            }

        }

        
catch (SQLException e) {
            e.printStackTrace();
        }

        
        
return series;
    }

    
    
public String[] getMonths() {
        String[] months 
= null;

        
try {
            Statement stmt 
= con.createStatement();
            ResultSet rs 
= stmt.executeQuery("select distinct name from t_month");
            rs.last();
            months 
= new String[rs.getRow()];
            rs.first();
            rs.relative(
-1);
            
for(int i = 0; rs.next(); i++{
                months[i] 
= rs.getString(1);
            }

        }

        
catch (SQLException e) {
            e.printStackTrace();
        }

        
        
return months;
    }

    
    
public int getAmount(String name, String month) {
        
int amount = 0;
        
//Add your code here
        try {
            PreparedStatement ps 
= con.prepareStatement(
                    
"select amount from t_product, t_month where t_product.name = ? and t_month.name = ? " + 
                    
" and t_product.month = t_month.id");
            ps.setString(
1, name);
            ps.setString(
2, month);
            ResultSet rs 
= ps.executeQuery();
            
if(rs.next()) {
                amount 
= rs.getInt(1);
            }

        }

        
catch (SQLException e) {
            e.printStackTrace();
        }

        
return amount;
    }
posted @ 2009-10-24 01:35 Infernus 阅读(1200) | 评论 (0)编辑 收藏

 

package com.tsinghuait.beans;

import static org.junit.Assert.*;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class TestShoppingCart {
    
private ShoppingCart sc = null;
    
    @Before
//加上@Before的是测试前的代码,方法名不限,但必须加上@Before。
    public void setUp() throws Exception {
        System.out.println(
"创建测试环境");
        sc 
= new ShoppingCart();
        sc.add(
"坦克"120.0);
        sc.add(
"飞机"180.0);
        sc.add(
"坦克"120.0);
    }

    
    @Before
    
public void show() {
        System.out.println(
"hahaha");
    }

    
    @After
//加上@After的是测试后的代码,方法名不限,但必须加上@After。
    public void tearDown() {
        sc 
= null;
        System.out.println(
"销毁测试环境");
    }

    
    @After
    
public void goodbye() {
        System.out.println(
"Goodbye");
    }


    @Test
//加上@Test的是测试代码,方法名不限,但必须加上@Test。
    public void testAdd() {
        
//fail("Not yet implemented");
        sc.add("大炮"15.5);
        assertEquals(
"大炮", sc.getItems().get(2).getName());
        assertEquals(
15.5, sc.getItems().get(2).getPrice());
        assertEquals(
1, sc.getItems().get(2).getAmount());
        sc.add(
"大炮"15.5);
        assertEquals(
"大炮", sc.getItems().get(2).getName());
        assertEquals(
15.5, sc.getItems().get(2).getPrice());
        assertEquals(
2, sc.getItems().get(2).getAmount());
    }


    @Test
    
public void testRemove() {
        
//fail("Not yet implemented");
        assertEquals(2, sc.getItems().get(0).getAmount());
        sc.remove(
"坦克");
        assertEquals(
1, sc.getItems().get(0).getAmount());
    }


    @Test
    
public void testGetTotal() {
        assertEquals(
420.0, sc.getTotal());
        
//assertEquals(); 方法可以用作黑箱测试,前一个参数是应该得出的结果,后一个是代码执行的结果。两项比较后相同测试通过
    }

}


如果有多个测试,只有全部通过后JUnit窗口上才会显示绿条。有一个未通过都是红色的,Eclipse的JUnit窗口上也会有提示哪项未通过。
posted @ 2009-10-24 01:02 Infernus 阅读(173) | 评论 (0)编辑 收藏