CXF Spring开发WebService,基于SOAP和REST方式
2016-01-16 00:23
483 查看
官网示例
http://cxf.apache.org/docs/writing-a-service-with-spring.html
http://cxf.apache.org/docs/jax-rs-basics.html#JAX-RSBasics-HTTPMethod
----
版本CXF2.6.9
添加的包文件
这个版本的不可在Tomcat7上运行,会出错。
配置文件
applicationContext.xml
[html] view
plaincopy
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<jaxws:endpoint id="helloWorld" implementor="demo.spring.service.HelloWorldImpl" address="/HelloWorld" />
<!-- http://localhost:7777/CXFDemo/services -->
<!-- http://localhost:7777/CXFDemo/services//HelloWorld?wsdl -->
</beans>
web.xml
[html] view
plaincopy
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
接口及实现类文件
[java] view
plaincopy
package demo.spring.service;
import javax.jws.WebService;
@WebService
public interface HelloWorld {
String sayHi(String text);
}
[java] view
plaincopy
package demo.spring.service;
import javax.jws.WebService;
@WebService(endpointInterface="demo.spring.service.HelloWorld")
public class HelloWorldImpl implements HelloWorld {
@Override
public String sayHi(String text) {
System.out.println("sayHi called");
return "Hello " + text;
}
}
----------------
发布REST风格的webservice
定义接口和类
[java] view
plaincopy
package dcec.rdd;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("")
public interface RestHelloWorld {
@GET
@Produces ({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
@Path("/say/{name}")
public String say(@PathParam("name")String name);
@GET
@Produces ({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
@Path("/getUser/{id}")
public List<User> getUser(@PathParam("id")String id);
@GET
@Path("/login")
public String login(@QueryParam("name")String name,@QueryParam("ps")String ps);
}
[java] view
plaincopy
package dcec.rdd;
import java.util.ArrayList;
import java.util.List;
import javax.ws.rs.PathParam;
//@Service("rest_HelloWorldImpl")
public class RestHelloWorldImpl implements RestHelloWorld {
public String say(String name) {
System.out.println(name + ", welcome");
return name+", welcome you.";
}
public List<User> getUser(String id){
List<User> list=new ArrayList<User>();
User user=new User();
user.setId(id);
user.setName("chen");
list.add(user);
User user1=new User();
user1.setId(id);
user1.setName("chen shi");
list.add(user1);
User user2=new User();
user2.setId(id);
user2.setName("chen shi cheng");
list.add(user2);
return list;
}
public String login(String name,String ps){
return "name: "+name+", password:"+ps;
}
}
[java] view
plaincopy
package dcec.rdd;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="user")
public class User {
private String id;
private String name;
@XmlElement(name="ID")
public String getId(){
return id;
}
public void setId(String id){
this.id=id;
}
@XmlElement(name="NAME")
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
}
拦截器自定义
[java] view
plaincopy
package dcec.rdd;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import javax.servlet.http.HttpServletRequest;
import org.apache.cxf.binding.xml.XMLFault;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.apache.cxf.transport.http.AbstractHTTPDestination;
public class HelloInInterceptor extends AbstractPhaseInterceptor<Message> {
public HelloInInterceptor(String phase) {
super(phase);
}
public HelloInInterceptor(){
super(Phase.RECEIVE);
}
public void handleMessage(Message message)throws Fault{
HttpServletRequest request=(HttpServletRequest)message.get(AbstractHTTPDestination.HTTP_REQUEST);
System.out.println("请求的字符集编码 "+request.getCharacterEncoding());
System.out.println("请求的URL "+request.getRequestURL());
// try {
// request.setCharacterEncoding("unicode");
// } catch (UnsupportedEncodingException e1) {}
String ip=request.getRemoteAddr();
System.out.println(request.getRequestURI());
Enumeration<String> e=request.getHeaderNames();
while(e.hasMoreElements()){
String str=e.nextElement();
System.out.println(str+" "+request.getHeader(str));
}
System.out.println(ip);
// XMLFault xmlFault=new XMLFault("异常");
// xmlFault.setStatusCode(4000);
// xmlFault.setMessage("wrong user and password");
//
// if(true)
// throw new Fault(xmlFault);
// System.out.println("****************************进入拦截器*********************************************");
// System.out.println(message);
//
// if (message.getDestination() != null) {
// System.out.println(message.getId() + "#"+message.getDestination().getMessageObserver());
// }
// if (message.getExchange() != null) {
// System.out.println(message.getExchange().getInMessage() + "#"+ message.getExchange().getInFaultMessage());
// System.out.println(message.getExchange().getOutMessage() + "#"+ message.getExchange().getOutFaultMessage());
// }
// System.out.println("**************************离开拦截器**************************************");
}
}
[java] view
plaincopy
package dcec.rdd;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.cxf.binding.xml.XMLFault;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.apache.cxf.transport.http.AbstractHTTPDestination;
public class HelloOutInterceptor extends AbstractPhaseInterceptor<Message> {
public HelloOutInterceptor(String phase) {
super(phase);
}
public HelloOutInterceptor(){
super(Phase.SEND);
}
public void handleMessage(Message message)throws Fault{
HttpServletResponse response=(HttpServletResponse)message.get(AbstractHTTPDestination.HTTP_RESPONSE);
response.setCharacterEncoding("utf-8");
System.out.println("**************************离开拦截器**************************************");
}
}
配置文件
[html] view
plaincopy
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:jaxrs="http://cxf.apache.org/jaxrs"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<jaxws:endpoint id="helloService" implementor="dcec.server.HelloServiceImpl" address="/helloService" />
<jaxws:endpoint id="PrintNameService" implementor="dcec.server.PrintNameImpl" address="/PrintNameService" />
<bean id="restHelloWorldImpl" class="dcec.rdd.RestHelloWorldImpl" />
<bean id="helloInInterceptor" class="dcec.rdd.HelloInInterceptor"/>
<bean id="helloOutInterceptor" class="dcec.rdd.HelloOutInterceptor"/>
<jaxrs:server id="restHelloWorld" address="/v1">
<jaxrs:serviceBeans>
<ref bean="restHelloWorldImpl" />
</jaxrs:serviceBeans>
<!--拦截器,请求和响应-->
<jaxrs:inInterceptors>
<ref bean="helloInInterceptor"/>
</jaxrs:inInterceptors>
<jaxrs:outInterceptors>
<ref bean="helloOutInterceptor"/>
</jaxrs:outInterceptors>
<jaxrs:extensionMappings>
<entry key="json" value="application/json" />
<entry key="xml" value="application/xml" />
</jaxrs:extensionMappings>
</jaxrs:server>
</beans>
访问地址测试
http://localhost:7777/CXFDemo/ws/ http://localhost:7777/CXFDemo/ws/v1/say/33 http://localhost:7777/CXFDemo/ws/v1/getUser/23/33?_type=json http://localhost:7777/CXFDemo/ws/v1/getUser/23/33?_type=xml //默认的方式xml
http://192.168.133.179:7777/CXFDemo/ws/v1/login?name=chen&ps=123
=========================================================
POJO类的参数
/article/7689402.html
[java] view
plaincopy
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "book")
public class Book {
private int bookId;
private String bookName;
public int getBookId() {
return bookId;
}
public void setBookId(int bookId) {
this.bookId = bookId;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String toString(){
return "[bookId:"+bookId+"],[bookName:"+bookName+"]";
}
}
[java] view
plaincopy
/**
* JSON提交
* url:http://localhost:9000/rest/json/addBook
* Json format:{"book":{"bookId":123,"bookName":"newBook"}}
*/
@POST
@Path("/addBook")
@Consumes("application/json")
public Response addBook(Book book);
/**
* Json提交2
* url:http://localhost:9000/rest/json/addBooks
* Json format:{"book":[{"bookId":123,"bookName":"newBook"},{"bookId":456,"bookName":"newBook2"}]}
*/
@POST
@Path("/addBooks")
@Consumes("application/json")
public Response addBooks(List<Book> books);
[java] view
plaincopy
@Override
public Response addBook(Book book) {
System.out.println("addBook is called...");
return Response.ok().entity(book.toString()).build();
}
@Override
public Response addBooks(List<Book> books) {
System.out.println("addBooks is called...");
return Response.ok().entity("ok").build();
}
测试html 提交
[html] view
plaincopy
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="http://192.168.133.179:8080/ychserver/ws/v1/file/imageupload" method="post" enctype="multipart/form-data" >
<p>id:<input type="text" name="id"/></p>
<p>name:<input type="text" name="name"/></p>
<p>image:<input type="file" name="file"/>
<p><input type="submit" value="sub"/></p>
</form>
</body>
</html>
http://cxf.apache.org/docs/writing-a-service-with-spring.html
http://cxf.apache.org/docs/jax-rs-basics.html#JAX-RSBasics-HTTPMethod
----
版本CXF2.6.9
添加的包文件
这个版本的不可在Tomcat7上运行,会出错。
配置文件
applicationContext.xml
[html] view
plaincopy
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<jaxws:endpoint id="helloWorld" implementor="demo.spring.service.HelloWorldImpl" address="/HelloWorld" />
<!-- http://localhost:7777/CXFDemo/services -->
<!-- http://localhost:7777/CXFDemo/services//HelloWorld?wsdl -->
</beans>
web.xml
[html] view
plaincopy
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
接口及实现类文件
[java] view
plaincopy
package demo.spring.service;
import javax.jws.WebService;
@WebService
public interface HelloWorld {
String sayHi(String text);
}
[java] view
plaincopy
package demo.spring.service;
import javax.jws.WebService;
@WebService(endpointInterface="demo.spring.service.HelloWorld")
public class HelloWorldImpl implements HelloWorld {
@Override
public String sayHi(String text) {
System.out.println("sayHi called");
return "Hello " + text;
}
}
----------------
发布REST风格的webservice
定义接口和类
[java] view
plaincopy
package dcec.rdd;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("")
public interface RestHelloWorld {
@GET
@Produces ({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
@Path("/say/{name}")
public String say(@PathParam("name")String name);
@GET
@Produces ({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
@Path("/getUser/{id}")
public List<User> getUser(@PathParam("id")String id);
@GET
@Path("/login")
public String login(@QueryParam("name")String name,@QueryParam("ps")String ps);
}
[java] view
plaincopy
package dcec.rdd;
import java.util.ArrayList;
import java.util.List;
import javax.ws.rs.PathParam;
//@Service("rest_HelloWorldImpl")
public class RestHelloWorldImpl implements RestHelloWorld {
public String say(String name) {
System.out.println(name + ", welcome");
return name+", welcome you.";
}
public List<User> getUser(String id){
List<User> list=new ArrayList<User>();
User user=new User();
user.setId(id);
user.setName("chen");
list.add(user);
User user1=new User();
user1.setId(id);
user1.setName("chen shi");
list.add(user1);
User user2=new User();
user2.setId(id);
user2.setName("chen shi cheng");
list.add(user2);
return list;
}
public String login(String name,String ps){
return "name: "+name+", password:"+ps;
}
}
[java] view
plaincopy
package dcec.rdd;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="user")
public class User {
private String id;
private String name;
@XmlElement(name="ID")
public String getId(){
return id;
}
public void setId(String id){
this.id=id;
}
@XmlElement(name="NAME")
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
}
拦截器自定义
[java] view
plaincopy
package dcec.rdd;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import javax.servlet.http.HttpServletRequest;
import org.apache.cxf.binding.xml.XMLFault;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.apache.cxf.transport.http.AbstractHTTPDestination;
public class HelloInInterceptor extends AbstractPhaseInterceptor<Message> {
public HelloInInterceptor(String phase) {
super(phase);
}
public HelloInInterceptor(){
super(Phase.RECEIVE);
}
public void handleMessage(Message message)throws Fault{
HttpServletRequest request=(HttpServletRequest)message.get(AbstractHTTPDestination.HTTP_REQUEST);
System.out.println("请求的字符集编码 "+request.getCharacterEncoding());
System.out.println("请求的URL "+request.getRequestURL());
// try {
// request.setCharacterEncoding("unicode");
// } catch (UnsupportedEncodingException e1) {}
String ip=request.getRemoteAddr();
System.out.println(request.getRequestURI());
Enumeration<String> e=request.getHeaderNames();
while(e.hasMoreElements()){
String str=e.nextElement();
System.out.println(str+" "+request.getHeader(str));
}
System.out.println(ip);
// XMLFault xmlFault=new XMLFault("异常");
// xmlFault.setStatusCode(4000);
// xmlFault.setMessage("wrong user and password");
//
// if(true)
// throw new Fault(xmlFault);
// System.out.println("****************************进入拦截器*********************************************");
// System.out.println(message);
//
// if (message.getDestination() != null) {
// System.out.println(message.getId() + "#"+message.getDestination().getMessageObserver());
// }
// if (message.getExchange() != null) {
// System.out.println(message.getExchange().getInMessage() + "#"+ message.getExchange().getInFaultMessage());
// System.out.println(message.getExchange().getOutMessage() + "#"+ message.getExchange().getOutFaultMessage());
// }
// System.out.println("**************************离开拦截器**************************************");
}
}
[java] view
plaincopy
package dcec.rdd;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.cxf.binding.xml.XMLFault;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.apache.cxf.transport.http.AbstractHTTPDestination;
public class HelloOutInterceptor extends AbstractPhaseInterceptor<Message> {
public HelloOutInterceptor(String phase) {
super(phase);
}
public HelloOutInterceptor(){
super(Phase.SEND);
}
public void handleMessage(Message message)throws Fault{
HttpServletResponse response=(HttpServletResponse)message.get(AbstractHTTPDestination.HTTP_RESPONSE);
response.setCharacterEncoding("utf-8");
System.out.println("**************************离开拦截器**************************************");
}
}
配置文件
[html] view
plaincopy
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:jaxrs="http://cxf.apache.org/jaxrs"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<jaxws:endpoint id="helloService" implementor="dcec.server.HelloServiceImpl" address="/helloService" />
<jaxws:endpoint id="PrintNameService" implementor="dcec.server.PrintNameImpl" address="/PrintNameService" />
<bean id="restHelloWorldImpl" class="dcec.rdd.RestHelloWorldImpl" />
<bean id="helloInInterceptor" class="dcec.rdd.HelloInInterceptor"/>
<bean id="helloOutInterceptor" class="dcec.rdd.HelloOutInterceptor"/>
<jaxrs:server id="restHelloWorld" address="/v1">
<jaxrs:serviceBeans>
<ref bean="restHelloWorldImpl" />
</jaxrs:serviceBeans>
<!--拦截器,请求和响应-->
<jaxrs:inInterceptors>
<ref bean="helloInInterceptor"/>
</jaxrs:inInterceptors>
<jaxrs:outInterceptors>
<ref bean="helloOutInterceptor"/>
</jaxrs:outInterceptors>
<jaxrs:extensionMappings>
<entry key="json" value="application/json" />
<entry key="xml" value="application/xml" />
</jaxrs:extensionMappings>
</jaxrs:server>
</beans>
访问地址测试
http://localhost:7777/CXFDemo/ws/ http://localhost:7777/CXFDemo/ws/v1/say/33 http://localhost:7777/CXFDemo/ws/v1/getUser/23/33?_type=json http://localhost:7777/CXFDemo/ws/v1/getUser/23/33?_type=xml //默认的方式xml
http://192.168.133.179:7777/CXFDemo/ws/v1/login?name=chen&ps=123
=========================================================
POJO类的参数
/article/7689402.html
[java] view
plaincopy
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "book")
public class Book {
private int bookId;
private String bookName;
public int getBookId() {
return bookId;
}
public void setBookId(int bookId) {
this.bookId = bookId;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String toString(){
return "[bookId:"+bookId+"],[bookName:"+bookName+"]";
}
}
[java] view
plaincopy
/**
* JSON提交
* url:http://localhost:9000/rest/json/addBook
* Json format:{"book":{"bookId":123,"bookName":"newBook"}}
*/
@POST
@Path("/addBook")
@Consumes("application/json")
public Response addBook(Book book);
/**
* Json提交2
* url:http://localhost:9000/rest/json/addBooks
* Json format:{"book":[{"bookId":123,"bookName":"newBook"},{"bookId":456,"bookName":"newBook2"}]}
*/
@POST
@Path("/addBooks")
@Consumes("application/json")
public Response addBooks(List<Book> books);
[java] view
plaincopy
@Override
public Response addBook(Book book) {
System.out.println("addBook is called...");
return Response.ok().entity(book.toString()).build();
}
@Override
public Response addBooks(List<Book> books) {
System.out.println("addBooks is called...");
return Response.ok().entity("ok").build();
}
测试html 提交
[html] view
plaincopy
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="http://192.168.133.179:8080/ychserver/ws/v1/file/imageupload" method="post" enctype="multipart/form-data" >
<p>id:<input type="text" name="id"/></p>
<p>name:<input type="text" name="name"/></p>
<p>image:<input type="file" name="file"/>
<p><input type="submit" value="sub"/></p>
</form>
</body>
</html>
相关文章推荐
- Java图形界面设计——substance皮肤
- java随机数:彩票抽奖 + 验证码
- Struts,Hibernate,Spring经典面试题
- Spring面试问答Top 25
- java多线程下载文件
- Spring3 @ResponseBody注解引起头部Accept-Charset过大
- Spring MVC
- Javaweb和spring和springmvc和maven使用记录
- 使用maven创建javaweb项目
- javaWeb项目编码问题探索
- Eclipse-----Eclipse设置字体
- eclipse快捷键大全
- Eclipse使用笔记
- Eclipse-----Eclipse导入源码
- Java学习1
- java基础介绍(转)
- Java I/O操作总结
- java保存两位小数
- Java注解入门
- JAVA常用类库