panda

IT高薪不是梦!!

统计

留言簿

阅读排行榜

评论排行榜

2009年7月7日 #

文件上传(FileUpload)

1.使用JAR
      jsp文件上传主要使用了两个jar包,commons-fileupload-1.2.1.jar和commons-io-1.4.jar
2.代码实现
     public class UploadServlet extends HttpServlet {

 /**
  *
  */
 private static final long serialVersionUID = 1L;

 private ServletContext sc;

 private String savePath;

 @Override
 protected void doGet(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {
  doPost(request, response);
 }

 @Override
 protected void doPost(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {

  System.out.println("请求进来了..........");

  // 设置请求的编码
  request.setCharacterEncoding("UTF-8");

  DiskFileItemFactory factory = new DiskFileItemFactory();//创建一个磁盘文件工厂
  ServletFileUpload upload = new ServletFileUpload(factory);

  try {
   List items = upload.parseRequest(request);
   Iterator it = items.iterator();
   while (it.hasNext()) {
    FileItem item = (FileItem) it.next();

    if (item.isFormField()) {
     System.out.println("表单的参数名称:" + item.getFieldName()
       + ",对应的参数值:" + item.getString("UTF-8"));
    } else {
     // 获取文件扩展名
     String strtype = item.getName().substring(
       item.getName().length() - 3,
       item.getName().length());
     strtype = strtype.toLowerCase();

     if (strtype == "jpg" || strtype == "gif"
       || strtype == "txt") {
      if (item.getName() != null
        && !item.getName().equals("")) {
       System.out.println("上传文件的大小:" + item.getSize());
       System.out.println("上传文件的类型:"
         + item.getContentType());
       System.out.println("上传文件的名称:" + item.getName());

       System.out.println("文件的扩展名" + strtype);
       File tempFile = new File(item.getName());
       File file = new File(
         sc.getRealPath("/") + savePath, tempFile
           .getName());
       item.write(file);

       request.setAttribute("upload.message", "上传文件成功!");

      } else {
       request.setAttribute("upload.message",
         "没有选择上传文件获取格式不支持");
      }
     } else {
      request.setAttribute("upload.message", "上传文件格式不支持");
     }
    }
   }
  } catch (Exception e) {
   e.printStackTrace();
   request.setAttribute("upload.message", "上传文件不成功!");
  }
  // 转发
  request.getRequestDispatcher("/uploadResult.jsp").forward(request,
    response);
 }

 @Override
 public void init(ServletConfig config) throws ServletException {

  savePath = config.getInitParameter("savePath");
  sc = config.getServletContext();
 }

posted @ 2009-11-08 16:30 IT追求者 阅读(163) | 评论 (0)编辑 收藏

Hibernate的多对一关联映射

1.关联映射的本质:就是将关联关系映射到数据库中,关联关系指对象模型中的一个或多个引用.

2.下面列举多对一的示例:用户和组(多个用户属于一个组)多对一关联映射是最常用的一种关联映射

   *User 类
   package com.lzy
   public class User{

   private int id;
   private String name;

  private Group group;//持有组的引用
   
   public User(){};

   //省略set,get方法
 }


  *Group类
 package com.lzy
 public class Group{
  
   private int id;

   private String name;
   //省略get,set方法
 }

3.对对象进行关系映射,这也是Hibernate中比较难的一点。
  (1)User.hbm.xml
      
      <?xml version="1.0">
      <!DOCTYPE hibernate-mapping PUBLIC  "-//Hibernate/Hibernate Mapping DTD 3.0//EN" http://hibernate.sourceforge.net/hibernate-mapping-3.0
.dtd">
     <hibernate-mapping package="com.lzy">
         <class name="User" table="t_user">
               <id name="id" column="id">
                     <genarator class="native"/>
              </id>
            <property name="name" column="user_name" not-null="true"/>
            <many-to-one name="group" column="groupid"/>
        </calss>
     </hibernate-mapping>


   (2)Group.hbm.xml
         
      <?xml version="1.0">
      <!DOCTYPE hibernate-mapping PUBLIC  "-//Hibernate/Hibernate Mapping DTD 3.0//EN" http://hibernate.sourceforge.net/hibernate-mapping-3.0
.dtd">
     <hibernate-mapping package="com.lzy">
         <class name="Group" table="t_group">
               <id name="id" column="id">
                     <genarator class="native"/>
              </id>
            <property name="name" column="group_name" not-null="true"/>
      </class>
   </hibernate-mapping>

4.测试

public class  Test {
   
  public static void main(String args[]){

      SessionFactory  sessionFactory=null;
      Session  session=null;
      Transaction   transaction=null;
      
      sessionFactory = HibernateUtil.getSessionFactory();// 创建一个会话工厂
      session = sessionFactory.openSession();// 创建一个会话实例
      transaction = session.beginTransaction();// 申明一个事务

  User user= new User();
  Group group = new Group();

  user.setName("龙一");

  group.setName("中南大学");
  user.setGroup(group);

  try {

   transaction.begin();
   session.save(user);
   transaction.commit();

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


   }
}

posted @ 2009-10-12 17:56 IT追求者 阅读(1417) | 评论 (2)编辑 收藏

struts logic标签使用详解

Logic 比较标签(一)

1.<logic:equal>

判断变量是否与指定的常量相等。例如:

     <%

       pageContext.setAttribute("test",new Integer(100));

     %>

     <logic:equal value="100" name="test">

         test=100     </logic:equal>

2.<logic:greaterThan>

判断常量变量是否与指定的常量不相等。

<html:link page="/greaterThan.jsp?test=123456">添加参数</html:link> //传值

<logic:greaterThan value="12347" parameter="test">

       true

</logic:greaterThan>

下面类似

3.<logic:greaterEqual>

判断变量大小是否等于指定的常量。

4.<logic:lessThan>

判断变量是否小于指定的常量。

5.<logic:lessEqual>

判断变量是否小于等于指定的常量。

Struts logic标签(二)

循环遍历标签<logic:iterate>

该标签用于在页面中创建一个循环,以次来遍历数组、Collection、Map这样的对象。在Struts中经常用到!

例如:

<%

String []testArray={"str0","str1","str2","str3","str4","str5"};

pageContext.setAttribute("test",testArray);

%>

<logic:iterate id="array" name="test">

        <bean:write name="array"/>

</logic:iterate>

首先定义了一个字符串数组,并为其初始化。接着,将该数组存入pageContext对象中,命名为test1。然后使用logic:iterate标记的name属性指定了该数组,并使用id来引用它,同时使用bean;write标记来将其显示出来。

还可以通过length属性指定输出元素的个数,offset属性指定从第几个元素开始输出。例如:

<logic:iterate id="array1" name="test1" length="3" offset="2">

<bean:write name="array1"/><br>

</logic:iterate>

Struts logic标签(三)

<logic:match>

<logic:notmatch>

该标签用于判断变量中是否或者是否不包含指定的常量字符串。例如:

<%

        pageContext.setAttribute("test","helloWord");

%>

<logic:match value="hello" name="test">

       hello 在helloWord中

</logic:match>

Match标记还有一个重要属性,就是location属性。location属性所能取的值只有两个,一个是"start",另一个是"end"。例如:

<logic:match value="hello" name="test" location="start">

          helloWord以 hello开头

</logic:match>

Struts logic存在标签(四)

<logic:present>

<logic:notpresent>

<logic:messagePresent>

<logic:messageNotPresent>

<logic:present>和<logic:notpresent>标签主要用于判断所指定的对象是否存在;

例如:

<%

pageContext.setAttribute("test","testString");

%>

<logic:present name="test">

        true  

</logic:present>

<logic:present>和<logic:notpresent>标记有以下几个常用属性:

header属性:     判断是否存在header属性所指定的header信息。

parameter属性:判断是否存在parameter属性指定的请求参数。

cookie属性:     判断cookie属性所指定的同名cookie对象是否存在。

name属性:       判断name属性所指定的变量是否存在。

property属性:和name属性同时使用,当name属性所指定的变量是一个JavaBean时,判断property属性所指定的对象属性是否存在。

<%

       Cookie cookie=new Cookie("name","value");

       response.addCookie(cookie);

%>

<logic:present cookie="name">

        true

</logic:present>

<logic:messagePresent>和<logic:messageNotPresent>这两个标记是来判断是否在request内存在特定的ActionMessages或ActionErrors对象。它们有几个常用的属性:

name属性:     指定了ActionMessages在request对象内存储时的key值。

message属性:message属性有两种取值。当其为true时,表示使用Globals.MESSAGE_KEY做为从request对象中获取ActionMessages的key值,此时无论name指定什么都无效;当其为false时,则表示需要根据name属性所指定的值做为从request对象中获取ActionMessages的key

值,倘若此时未设置name属性的值,则使用默认的Globals.ERROR_KEY。

property属性:指定ActionMessages对象中某条特定消息的key值。

例如:

      <%

         ActionErrors errors = new ActionErrors();

         errors.add("totallylost", new ActionMessage("application.totally.lost"));

         request.setAttribute(Globals.ERROR_KEY, errors);

         request.setAttribute("myerrors", errors);

      %>

         <logic:messagesPresent name="myerrors">

           Yes

         </logic:messagesPresent>

Struts logic判空标签(五)

<logic:empty>

<logic:notEmpty>

该标签用于判断指定的字符是否为空。

例如:

      <%

        pageContext.setAttribute("test","");

      %>

  

     <logic:empty name="test">

         test 为空

     </logic:empty>

Struts logic转发和重定向标签(六)

1.<logic:foward>转发标签

该标签用于进行全局转发,使用该标签的页面一般不再编写其他内容,因为随着转发,页面将跳转,原页面中的内容也没有意义了。例如:

      this is a test

<logic:forward name="welcome"/>

     this is a new test

2.<logic:redirect>重定向标签

该标签用于进行重定向。具有属性:

href属性:     将页面重定向到href指定的完整外部链接。

page属性:     该属性指定一个本应用内的一个网页,标记将页面重定向到这个新的网页。

forward属性:该属性与struts-config.xml中的<global-forward>内的子项相对应。即将页面重定向到forward所指定的资源。

posted @ 2009-07-16 23:51 IT追求者 阅读(511) | 评论 (0)编辑 收藏

struts bean标签使用详解

Bean 标签库
        此标签库和Java Bean有很强的关联性,设计的本意是要在JSP 和JavaBean 之间提供一个接口。Struts 提供了一套小巧有用的标签库来操纵JavaBean和相关的对象:cookie、 header、 parameter、 define、write、message、 include、page、resource、size、struts。
-------------------------------
-------------------------------
bean:cookie、bean:header、bean:parameter
这三个标签用来重新得到cookie, request header和request parameter。
bean:header和bean:parameter标签定义了一个字符串;bean:cookie标签定义了一个Cookie对象。你可以使用value属性做为默认值。如果找不到指定的值,且默认值没有设定的话,会抛出一个request time异常。如果你期望返回多个值的话,可把multiple属性设为true。
<bean:cookie id="sessionID" name="JSESSIONID" value="JSESSIONID-ISUNDEFINED"/>
// 这段代码定义了一个名为sessionID的脚本变量,如果找不到一个名为JSESSIONID的cookie,那sessionID


下面代码会输出一些Cookie对象的一些属性:
<jsp:getProperty name="sessionID " property="comment"/> …
<jsp:getProperty name="sessionID" property="domain"/> …
<jsp:getProperty name="sessionID" property="maxAge"/> …
<jsp:getProperty name="sessionID" property="path"/> …
<jsp:getProperty name="sessionID" property="value"/> …
<jsp:getProperty name="sessionID" property="version"/> …

下面是在request中输出所有header的例子:
<%
          java.util.Enumeration names =((HttpServletRequest) request).getHeaderNames();
%>

<%
          while (names.hasMoreElements()) {
          String name = (String) names.nextElement();
%>
<bean:header id="head" name="<%= name %>"/>
… <%= name %>
… <%= head %>

<%
          }
%>

下面是parameter的例子:
<bean:parameter id="param1" name="param1"/>
<bean:parameter id="param2" name="param2" multiple="true"/>    // 此处定义了一个param2[]。
<bean:parameter id="param3" name="param3" value="UNKNOWN VALUE"/>

于其它标签结合使用:
<bean:header id="browser" name="User-Agent"/>
<P>You are viewing this page with: <bean:write name="browser"/></P>
----------------------------------------------------------------------------------------------------------------------------------
<bean:cookie id="username" name="UserName" scope="session"
value="New User" />
<P>Welcome <bean:write name="username" property="value"/!</P>
    // 根据cookie创建一个新的Bean,如果用户名称已经存储在cookie中,它就不显示为一个新用户。
-------------------------------
-------------------------------
bean:define:有三个用途。
一是定义新字符串常量:
<bean:define id="foo" value="This is a new String"/>
<bean:define id="bar" value='<%= "Hello, " + user.getName() %>'/>
<bean:define id="last" scope="session" value='<%= request.getRequestURI() %>'/>
二是复制一个现有的bean给新的bean:
<bean:define id="foo" name="bar"/>   
<bean:define id="baz" name="bop" type="com.mycompany.MyClass"/>    //定义脚本变量的类型,默认为Object   
三是复制一个现有的bean的属性给新的bean:
<bean:define id="bop" name="user" property="role[3].name"/>
    <bean:define id="foo" name="bar" property="baz" scope="request"    toScope="session"/>
    //toScope属性指新bean的scope,默认为page  
上段代码的意思是把名为bar的bean的baz属性赋值给foo,foo的类型为String(默认)。
-------------------------------
-------------------------------
bean:include
这个标签和bean:include标签和相似,不同点就是它定义了一个可以复用的脚本变量。用id属性命名一个新的脚本变量,还支持forward、href、page和transaction.属性,和html:link中的属性意义一样。
<bean:include id="footerSpacer"    page="/long/path/footerSpacer.jsp"/>
然后你能够在多个地方(scope为page)调用:
<bean:write name="footerSpacer" />

-------------------------------
-------------------------------
bean:message
用来实现对国际化的支持的一个标签,配合java.util数据包中定义的Locale和ResourceBundle类来完成这个任务,用java.text.MessageFormat类配置消息的格式。
    首先要指定资源文件的名称。这个文件会包含用默认语言编写的在程序中会出现的所有消息,这些消息以“关键字-值”的形式存储。文件需要存储在类路径下,路径要作为初始化参数传送给ActionServlet。
    实现国际化的规定:所有的资源文件必须都存储在基本资源文件所在的目录中。基本资源文件包含的是用默认地区语言-本地语言编写的消息。如果基本资源文件的名称是ApplicationResources.properties,那么用其他特定语言编写的资源文件的名称就应该是ApplicationResources_xx.properties(xx为ISO编码,如英语是en)。因此这些文件应包含相同的关键字,但关键字的值是用特定语言编写的。
    然后,ActionServlet的区域初始化参数必须与一个true值一起传送,这样ActionServlet就会在用户会话中的Action.LOCALE_KEY关键字下存储一个特定用户计算机的区域对象。现在可以运行一个国际化的web站点,它可以根据用户计算机上的设置的区域自动以相应的语言显示。

使用特定的字符串来替换部分消息:
在资源文件中的定义:info.myKey = The numbers entered are {0},{1},{2},{3}
标记的使用:<bean:message key="info.myKey" arg0="5" arg1="6" arg2="7" arg3="8"/>
Jsp页面的显示:The numbers entered are 5,6,7,8    // 最多支持4个参数
-------------------------------

-------------------------------
   bean:page:把Jsp中的内部对象做为脚本变量。
<bean:page id="requestObj" property="request"/>
-------------------------------
-------------------------------
bean:resource:获得应用程序的资源,这个资源可以是一个String或从java.io.InputStream中读入。使用ServletContext.getResource()ServletContext.getResourceAsStream() 方法检索web应用中的资源,如果在检索资源时发生问题,就会产生一个ruquest time异常。
<bean:resource id="webxml" name="/WEB-INF/web.xml"/>
使用input属性时,资源会做为一个InputStream,如果不指定就被当成一个String。

-------------------------------
-------------------------------
bean:size:得到存储在array、collection或map中的数目,类型为java.lang.Integer。
<bean:size id="count" name="employees" />
-------------------------------
-------------------------------
bean:struts:复制Struct 对象(三种类型)给新的bean,scope为page。
<bean:struts id="form" formBean="CustomerForm"/>   
<bean:struts id="fwd" forward="success"/>
<bean:struts id="map" mapping="/saveCustomer"/>
-------------------------------
-------------------------------
bean:write:以字符串形式输出bean的属性值。
filter属性:设为true时,将HTML保留字转换为实体("<" 转换为 &lt);
ignore属性:如果对象不存在,不会抛出异常。
<bean:write name="userRegistration" property="email" scope="request"/>

posted @ 2009-07-16 23:13 IT追求者 阅读(505) | 评论 (0)编辑 收藏

struts Html标签使用详解

1.html:form 标签
       该标签的用法必须遵循很多规则.
        (1)首先标签中必须包含一个action属性,action属性是该标签唯一一个必须的属性.如果没有该属性jsp会抛出一个异常,     之后你必须给
action属性一个有效的值,这个值也就是对应struts配置文件(struts-config.xml)中的action标签中的type属性值.
          例如:jsp页面中有:<html:form action="/login">
                   则struts-config.xml文件中:
                                                                  <action-mapping>
                                                                        <action type="/login"
                                                                                      type="对应事件处理类的路径"
                                                                                      name="对应的formbean"
                                                                                       />
                                                                    </action-mapping>
       (2)html:form标签还必须遵循一个规则:
                            任何包含在<form>中用来接收用户输入的标签(<text>、<password>、<hidden>、<textarea>、<radio>、<checkbox>、<select>
)必须在相关的form bean中有一个指定的属性值.例如,如果你有一个属性值被指定为“username”的<text>标签,那么相关的form bean中也
必须有一个名为“username”的属性。输入<text>标签中的值会被用于生成form bean的userName属性。

2.html:text标签
          html:text标签是一个生成文本框的标签,它必须包含一个和form bean的相同属性的对应的"property"属性.该标签只有嵌套在form中才有效.


3.html:password标签

        html:password标签是用来显示口令的文本框,它也必须包含一个和form bean的相同属性对应的"property"属性,该标签中的
         一个很重要的属性是“redisplay”,它用于重新显示以前输入到这个区域中的值。该属性的缺省值为true。然而,为了
       使password不能被重新显示,你或许希望将该属性的值设为false。
        例如:<html:password property="password"/>


4.html:hadden标签
          html:hadden是生成一个隐藏的输入文本区域,它必须包含和相关form bean中的相同属性对应的“property”属性。该标签也必须嵌套在form中才有效.
          例如:<html:hadden property="value"/>


5.<html:textarea>标签 
        <html:textarea>标签主要是生成一个文本域,它必须包含和相关form bean中相同属性对应的"property"属性.该标签也必须嵌套在form中才有效.
        例如:<html:textarea property="content"
                                          cols="10"
                                          rows="5"/>

6.<html:radio>标签

            <html:radio>标签是用于显示一个单选按钮.它必须包含"value"值
           例如:<html:radio property="title" value="1"/>1
                     <html:radio property="title" value="2"/>2
                     <html:radio property="title" value="3"/>3



7.<html:checkbox>标签


        <html:checkbox>标签用于显示checkbox类型的输入区域。比如: <html:checkbox property= 
   "notify">Please send me notification 


8.<html:submit>标签

            <html:submit>标签是用于提交按钮.
            例如:<html:submit value="提交"/>



9.<html:reset>标签

            <html:reset>标签主要是用于重置按钮


10.<html:option>标签

               <option>标签用于显示select box中的一个选项。参照下面的<select>标签。 


11.<html:select>标签

                <html:select>标签主要是用于显示下拉列表,它也必须嵌套在form中才有效
                例如:
                        <html:select  property="color" size="3">
                                      <html:option  value="red">red</html:option>
                                      <html:option value="green">green</html:option>
                                       <html:option value="blue">blue</html:option>

 




           



            








 

posted @ 2009-07-16 22:00 IT追求者 阅读(1622) | 评论 (0)编辑 收藏

Ado.net中Connection对象用法

在ADO.NET对象模型中,Connection对象代表了与数据源之间的连接。.NET框架中有两个Connection对象:一个是OleDbConnection,用于大多数的数据库连接,一个是SqlConnection,是MS开发的专门用于针对SQL Server的连接。在创建Connection对象之前,你必须先引用System.Data.OleDb或者System.Data.SqlClient和System.Data三个名空

1.Sqlserver 的数据库连接
        你可以使用Connection对象的属性来指定数据源的位置及其它参数来连接数据库。如:SqConnection conn=new SqlConnection("Provider=SQLOLEDB;Data Source=MyServer;Initial Catalog=database;use id=youuserName,password=yourpassword;");
        

        这是连接到本地数据库,如果你想连到网络上的的数据库,就要利用集成安全性,同时忽略用户名和密码。如:SqConnection con=new SqlConnection("Provider=SQLOLEDB;Data Source=MyServer;Initial Catalog=database;Integrated Security=SSPI");

 

2.Oracle数据库的连接:(前提:必须先安装Oracle客户端实用工具的适当版本,并创建数据库别名,接着就可以用以下的连接字符串进行连接)

SqConnection con=new SqlConnection("Provider=MSDAORA;Data Source=dbAlias;User id=yourid,password=youpwd;);

3.Access数据库的连接:(你可以使用以下连接字符串来连接)

SqConnection con=new SqlConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\yourdb.mdb;User id=yourid,password=youpwd;);

连接到数据库之后即可调用Connection对象的Open()方法来打开与数据库的连接,同理Close()方法用来关闭与数据库的连接。

连接池:

      连接池是什么?在一个三层结构中,当一个客户端与中间层服务器进行通讯的时候,服务器会创建一个与数据库连接,并执行操作的业务对象(也就是与数据库连接的实例),同时会创建一个Connection对象,在放在一个池中(实际上是一个线程)。当释放这个实例的时候,此实例便关闭,此时并没有真正的关闭数据连接,而是将Connection对象标记为关闭后存储在池中。如果这时再来启动一个新的业务对象,这时就会检查现有的连接,如果池中有打开的连接,即使用它,否则再创建一个新连接。

可能你会觉得很奇怪,如果这样,那池中不是有很多的对象,岂不是会浪费很多的资源,这个问题的解决方案是你可以设置与数据库的特定连接时间(默认60秒),如果在这个时间内未被使用,.NET提供就会关闭此连接。

      如何打开连接池?默认情况下是打开的.

      如何关闭连接池?可以使用OleDbConnection.ReleaseConnectionPool()方法来关闭连接池,更或者你可以在OLE DB连接字符串中加上OLE DB Services= - 4;在用SqlConnection对象时可在连接符中加上Pooling=False。这时你再调用Close()时候便会真正地关闭与数据库的连接。

(注1:可以使用SQL事件探查器或性能监视器来观察连接到数据库中的连接数目,以识别连接是否真正关闭或是只是放入池中。)

(注2:可以显式调用Dispose()方法在垃圾收集器回收之前释放资源,但如果你只是将Connection对象设为NULL的话,是不会断开与数据源的连接的)

      利用Connection对象来创建Command对象:(ADO.NET中用Command对象来执行数据查询,更新)例 :

SqConnection con=new SqlConnection("Provider=SQLOLEDB;Data Source=MyServer;Initial Catalog=database;Integrated Security=SSPI");

using (OleDbCommand cmd=con.CreateCommadn())

{

      cmd.CommandText="select * from table";

      cmd.ExecuteNonQuery();

}

(注:此处使用using 的好处是在进行此次操作后便可释放资源。)

利用Connection对象来创建Transaction对象:(Transaction对象是ADO.NET中的事务管理对象)

例:

SqConnection con=new SqlConnection("Provider=SQLOLEDB;Data Source=MyServer;Initial Catalog=database;Integrated Security=SSPI");

con.Open();

OleDbTransaction tran=con.BeginTransaction(); (注:调用此方法会在连接时返回一个新的打开的Transaction对象来进行事务管理)

(注:事务是指一组单一实体运行的语句,可以确保数据的完整性,防止因系统故障或其它原因而引起的数据丢失。概念很抽象,呵呵,看下去就明白了)

事务有ACID四个属性(即原子性,一致性,隔离性,持久性):

原子性指在执行事务过程中,这个过程要么成功执行,要么不执行。

一致性指事务前和事务后的数据的一致性,也就是如果事务成功执行的话,系统就返回成功的状态,即所有数据的改变标记为已完成,如没完成事务,即回滚,并回到先前的合法状态。

隔离性指一个事务内的任何变化都独立于其它的事务(相对于两个事务的说法)

持久性指事务是持续的,也就是事务成功完成后的改变是永久的。

其他详细使用可以参照MSDN

posted @ 2009-07-07 22:42 IT追求者 阅读(718) | 评论 (0)编辑 收藏

谁是增值税改革受益者 [转]

税制改革有利于提高上市公司的经营业绩,影响幅度呈逐年上升趋势;固定资产比例较高企业,受到影响的幅度越大;像宝钢这样的大型资本密集型企业将是消费型增值税制度改革的主要赢家。

《中央完善社会主义市场经济体制的决定》(简称《决定》)专门提出了改革现行增值税制度的问题,《决定》指出:“增值税由生产型改为消费型”,这表明了政府高层决策者决心改革已经试行十年之久的生产型增值税制度。国家税务总局的官员已经宣布有关部门正在根据《决定》的精神起草我国的《消费型增值税条例》,这表明了我国的消费型增值税制度改革正在紧锣密鼓地进行。

但谁是这场税制改革的受益者?受益程度有多大?这些无疑是投资者非常关心的问题。

对经营净利润的影响

在不同的增值税制度下,企业固定资产的成本计价不一样。

我国目前实行的是生产型增值税制度。根据《企业会计制度》的规定,固定资产在取得时应按取得时的成本入账,取得时的成本包括买价、增值税费用和其它有关费用(包括运输费用、非增值税税款、保险等),用公式表示就是:固定资产成本=买价+增值税+其它费用。

税制改革后将实行的是消费型增值税制度。由于购进固定资产的进项增值税可以抵扣,固定资产的取得成本中就不包含增值税这一块。显然,消费型增值税制度框架下的固定资产(不动产例外)成本,要低于生产型增值税制度条件下的固定资产成本。

到底低多少呢?我们以生产型增值税制度下的设备类固定资产成本为比较基准,假设所购设备执行基本税率17%,消费型增值税制度下固定资产成本的降低幅度为:17%/(1+17%)=15.54%,也就是说,降低幅度在1/7到1/6之间。

消费型增值税制度下设备类固定资产成本的降低幅度为15.54%,因此企业每期的设备折旧也相应降低15.54%。从前面的固定资产折旧成本转移过程来看,设备折旧的降低导致公司当期主营业务成本的降低,从而提高当期的主营业务利润。由于税制改革并不提高公司的经营成本(如营销成本、管理成本、资金成本)和其他业务经营,公司当期的营业利润也相应提高并最终提高公司的经营净利润。

根据现行《企业所得税暂行条例》的规定,因折旧成本降低而导致的企业利润增量也需要缴纳企业所得税,现行企业所得税税率为33%,公司每期因设备折旧降低而增加的净利润相当于现行会计期内公司设备折旧额的幅度为:15.54%×(1-33%)=10.41%。

由于企业的净利润受多种因素的影响,税制改革对公司净利润的影响幅度没有一个确定的比例,后面的案例研究能够提供一种计算方法并能给出钢铁行业的受益幅度。

对经营活动现金净流量的影响

在现行的生产型增值税制度下,公司购买固定资产的进项增值税不能抵扣,会计上计入固定资产成本,在现金流量表上体现为公司投资活动的现金流出。

在消费型增值税制度下购买固定资产的进项增值税可以抵扣,企业将比在现行生产型增值税制度下少流出现金,相对来说就是公司现金流量在现有基础上的增加。

消费型增值税制度下固定资产进项增值税的抵扣可以有两种方式:一种是在购进当期一次性抵扣,另一种是在增值税条例规定的年限内分期抵扣。

从消费型增值税制度的基本意义来看,固定资产进项增值税应当在购买当期一次性抵扣,这种一次性抵扣方式对公司最有利,但是企业固定资产的购置往往是少批次大金额,采取一次性抵扣会引起增值税收入的较大波动,而增值税是目前最大的一个税种,对政府财政的稳定性不利,因此未来的消费型增值税制度的实施细则很可能会采取一种变通的做法,要求企业在一定的年限内分期抵扣。从现金流的折现价值角度来看,分期抵扣方式不如一次性抵扣对企业有利。

从保守起见,假设新的消费型增值税制度采取在设备的预计使用期限(即折旧年限)内分期抵扣进项增值税的抵扣方法。以生产型增值税制度下公司现金流量为比较基础,消费型增值税制度下每期可以抵扣的进项增值税金额就等于当期的现金流量增量,即公司每期因设备折旧降低而增加的现金流量相当于现行会计期内公司折旧额的15.54%。

关注受益板块

在我国1300多家上市公司中,并不是所有的企业都会受益于本次税制改革。《上市公司行业分类指引》把上市公司分成13个门类,具体为:农牧业30家、采掘业20家、制造业739家、电煤水业51家、建筑业23家、交通仓储业55家、信息技术业76家、贸易业96家、金融保险业10家、房地产业45家、社会服务业41家、传播文化业11家、综合类81家。按照我国现行的税制体系,除建筑业、交通仓储业、金融保险业、房地产业、社会服务业、传播文化业及综合类等266家公司征收营业税而不征收增值税外,其他1012家上市公司都要征收增值税,占上市公司总数的79.19%,也就是说,将有大约80%的上市公司收益于消费型增值税制度改革。

从全国来看,已有1300多家上市公司,投资者可重点关注下列行业的资本密集型企业:(1)石化行业,如中国石化(600028)、齐鲁石化(600002)等;(2)冶金行业,如宝钢股份(600019)、马钢股份(600808)等;(3)电力行业,如长江电力(600900)、上海电力(600021)等;(4)汽车行业,如一汽轿车(000800)、上海汽车(600104)等;(5)机械行业,如中集集团(000039)、厦工股份(600815)等。

东北板块谁最受益

东北工业曾为共和国的经济建设立下了汗马功劳,现在中央提出了“振兴东北老工业基地”的战略部署,国家有关部门已经决定在我国东北地区率先进行消费型增值税制度改革的试点工作,东北企业将会最早享受到税制改革的好处。

在东北地区的120多家上市公司中,下列上市公司将会更多地享受到改革带来的利益:(1)石化行业,如锦州石化(000763);(2)冶金行业,如鞍钢新轧(000898);(3)电力行业,如龙电股份(600726);(4)汽车行业,如一汽轿车(000800);(5)机械行业,如沈阳机床(000410)。

按照前面的案例研究思路,以2002年度作为比较基准期,我们同样可以估算出消费型增值税制度改革对上述五家公司经营业绩的影响幅度。

消费型增值税制度改革在其他条件不变的前提下能够提升上市公司的经营业绩,但提升的幅度不一样。进一步的分析表明,资本物品进项增值税的抵扣数量是一个绝对值,比较基数越小,影响幅度就越大,因此税制改革其对基期经营业绩较差的上市公司的经营业绩影响幅度较大,如锦州石化和沈阳机床。

案例分析

宝钢股份影响程度剖析

由于两种增值税制度的交替,从企业固定资产成本的增值税构成角度可以把企业的固定资产分成两种类型,一类是生产型增值税制度下购置的固定资产,固定资产购进增值税不能抵扣;另一类是在消费型增值税制度下新购置的固定资产,其进项增值税可以抵扣。税制改革只对新购置的固定资产产生影响。

本文选取宝钢股份(600019)作为案例来测算消费型增值税制度改革对公司经营业绩的影响。为了研究的方便,以现行生产型增值税制度下的经营业绩作为比较基础,并选取2002年度报告的数据作为样本,测算该公司将在简单再生产(即经营规模不变)条件下的经营业绩增长趋势。实际上,宝钢股份是在扩大再生产条件下经营的,因此其实际经营业绩增长速度肯定要高于测算出的增长速度。

在简单再生产条件下,公司一年的固定资产投资规模等于当年的固定资产折旧金额,即宝钢股份每年的固定资产投资规模为538,230.40万元。由于不动产投资不涉及进项增值税,所以只考虑设备投资,宝钢股份一年新增设备投资规模为472,336.04万元,新增设备的进项增值税含量为:472,336.04/(1+17%)×17% = 68,630.02万元。

目前宝钢股份的设备综合折旧年限约为12年,则其新增设备的综合折旧年限亦可视为12年,新增设备的增值税含量也将在12年内被折旧摊销,折旧摊销中的增值税含量为68,630.02/12 = 5,719.17万元。

对经营净利润的影响幅度

在消费型增值税制度下,由于企业的各项经营成本(如管理费用、营业费用、财务费用等)并不因增值税制度的改变而变化,一年的所得税税前利润增量在数量上等于新增设备折旧中的增值税含量,即利润增量 = 5,719.17万元。

由于企业所得税制度没有改变,因增值税制度改变而增加的利润仍然需要缴纳所得税,则一年的经营净利润增量 = 5,719.17×(1-33%)= 3,831.84万元。

由于公司每年都在进行设备再投资,在新的税制条件下,公司每年的经营净利润增量随着时间的推移逐年递增,设第n年的净利润增量为Y(n),则:Y(n)= 3,831.84×n万元。由于设备综合折旧年限为12年,则n的最大值等于12。公司2002年度的净利润为427,193.24万元,设第n年的净利润增长率为L(n),则:L(n) = Y(n)/427,193.24。

对宝钢股份经营活动现金净流量的影响

从前面的折旧成本转移过程分析可知,消费型增值税制度改革最终通过降低产品销售成本来提高经营活动现金净流量,税制的改革并不影响其他各项经营活动的现金流出,因此一年的经营活动现金流增量等于每年新增设备折旧中包含的进项增值税含量,即经营活动现金流增量 = 5,719.17万元。

由于公司每年都在进行设备再投资,在新的税制条件下,公司经营活动现金流的增量随着时间的推移逐年递增,设第n年的净利润增量为M(n),则:M(n)= 5,719.17×n万元。由于设备综合折旧年限为12年,则n的最大值等于12。公司2002年度经营活动现金净流量为1,079,001.12万元,设第n年的净现金流增长率为X(n),则:X(n) = M(n)/1,079,001.12。

从上面的分析可以得出下列基本结论:

(1)税制改革有利于提高上市公司的经营业绩,影响幅度呈逐年上升趋势。

(2)固定资产比例较高企业,受到影响的幅度越大。

(3)像宝钢这样的大型资本密集型企业将是消费型增值税制度改革的主要赢家。

链接

由于来自美国等国家的竞争对手并不征收增值税,现有税制打击了我国资本密集型企业的市场竞争力,在加入WTO融入国际经济大环境的条件下,生产型增值税制度到了非改不可的时候了。

增值税计税原理

增值税制度起源于1918年德国的隆西蒙斯和美国的亚当斯的学说,但增值税真正得到欧洲各国政府广泛的重视是在二十世纪六十年代初。1962年,欧洲经济共同体的纽马克委员会建议所有欧共体成员国都采用增值税作为统一的产品销售税形式,但美国却至今尚未推行这一税种。

增值税是对商品生产和流通中各环节新增加价值(即增值额)进行征税,由于新增价值在商品流通过程中是一个难以准确计算的数据,因此实际操作中常采用一种抵扣计算法:纳税义务人根据产品销售额按照规定的税率计算销项增值税额,然后从中扣除购买原材料和/或资本品时已经缴纳的进项增值税额,计算公式为:应纳增值税额=销项增值税额–进项增值税额。这种计算方法同样体现了对产品销售中的新增价值进行征税的原则。

在实行增值税的半个多世纪里,不同的国家根据其国情选择具体的计税制度,已经形成了多种比较系统和成熟的计税制度,但常用的增值税计税制度只有三种:第一种是生产型增值税,厂商以其产品和劳务的销售收入数额减去其当期购入的用于生产的中间性产品和劳务支出的数额(厂房、机器、设备等资本品的折旧不予扣除)作为增值额,并据以课税。第二种是消费型增值税,其计税依据是在生产型增值税的基础上,再扣除同期购入的资本品价值得出应税增值额,即从厂商的产品销售收入中除其当期购入的所有中间性产品和劳务支出外,还要再扣除资本品支出。第三种是收入型增值税,其计税依据是厂商以其产品和应税劳务的销售收入先减去用于生产该产品的中间性产品和劳务支出,再减去固定资产折旧后的余额作为增值额,并据以课税。

生产型和消费型两种计税制度的区别是进项增值税的抵扣不一样,生产型增值税的进项增值税额是指纳税人当期购进用于产品生产的原材料或接受应税劳务所支付的增值税额,消费型增值税的进项增值税额不仅包含纳税人购进原材料或接受应税劳务所支付的增值税额,还包括纳税人购进固定资产等资本品所支付的增值税额,两种税制的差异就在购进资本品所支付的增值税额的处理上。很显然,对于同一个企业,生产型增值税的实际税负要大于消费型增值税的税负,从生产型增值税改变为消费型增值税的税制改革的本质就是增值税应税企业的税务降低。

我国的生产型增值税制度

我国从1979年开始增值税试点,1994年的税制改革全面推行了增值税,使之成为我国税制结构中占据第一位的主体税种。1993年12月13日,国务院以第134号令发布的《中华人民共和国增值税暂行条例》成为我国增值税征收的基本规范,随后(当年12月25日)财政部以[93]第038号文发布的《中华人民共和国增值税暂行条例实施细则》作为税务部门征收增值税的工作指南。

根据《增值税暂行条例》的规定,凡在中国境内销售货物或者提供加工、修理修配、劳务,以及进口货物的单位和个人,为增值税的纳税义务人。我国增值税征收采取了两档税率,即17%的基本税率和13%的低税率。低税率只适用于某些特定的货物(如粮食、食用植物油、自来水、书报、农药等,详见有关增值税法规)及国务院规定的货物,其它货物一律适用基本税率。

目前,我国增值税的计算采用抵扣计算法:应纳增值税额=当期销项增值税额–当期进项增值税额。其中,“当期销项增值税额”是指纳税义务人在一定纳税期限内销售货物(或应税劳务)所收到的增值税,它在数量上等于纳税期限内的销售收入乘以增值税率。“当期进项增值税”是指纳税义务人在同期采购原材料(或应税劳务)时已经支付的增值税,它在数量上等于纳税期限内的货物买价乘以增值税率。值得注意的是:现行《增值税暂行条例》特别规定“购进固定资产的进项增值税额不得从销项增值税额中抵扣”,并把“固定资产”严格限制为两类资产,一是使用期限超过1年的机器、机械、运输工具以及其它与生产经营有关的设备、工具、器具,二是单位价值在2000元以上并且使用年限超过2年的不属于生产经营主要设备的物品。《增值税暂行条例》规定的不得抵扣进项税额的购进固定资产的范围比现行《企业会计制度》规定的固定资产范围要小一些,主要是不包括不动产(如房屋、建筑物等),因为我国现行税法体系规定不动产销售缴纳营业税,不缴纳增值税,不动产销售没有进项增值税可以抵扣。

是否抵扣固定资产进项增值税是划分生产型增值税和消费型增值税的根本标准。由于现行《增值税暂行条例》明确规定固定资产进项增值税不得抵扣,因此我国现行的增值税制度是一种典型的生产型增值税。

改革生产型增值税制度的原因

现行生产型增值税制度导致资本密集型应税企业的实际税负很重。产品的销售成本由三块组成:原材料转移成本、固定资产折旧转移成本和生产工资成本,根据现行《增值税暂行条例》规定的计算方法,产品销售的增值额等于销售收入(主营业务收入)减去原材料转移成本,也就是说产品的折旧成本和工资成本在这里作为企业销售产品的增值额而需要缴纳增值税。企业实际得到的毛利润等于产品的销售收入减去产品销售成本。很显然,应税增值额大于企业的毛利润。折旧成本和工资成本的比例越大,其差异也越大,企业所得到的毛利润的实际税负就越重。这种生产型增值税制度导致资本密集型企业的毛利润承担偏高的税负,资本密集度越高,毛利润的实际税负越重。

然而来自美国等国家的竞争对手并不征收增值税,因此这种税制打击了我国资本密集型企业的市场竞争力,在加入WTO融入国际经济大环境的条件下,生产型增值税制度到了非改不可的时候了。 (艾西南 尹中立)
转自:http://www.china.org.cn/chinese/OP-c/490416.htm

posted @ 2009-07-07 22:21 IT追求者 阅读(151) | 评论 (0)编辑 收藏