<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # Java Servlet 提供 XML > 原文: [http://zetcode.com/articles/javaservletservexml/](http://zetcode.com/articles/javaservletservexml/) Java Servlet 服務 XML 展示了如何從 Java Servlet 服務 XML 數據。 數據存儲在 MySQL 表中。 該 Web 應用已部署在 Tomcat Web 服務器上。 ## XML 格式 可擴展標記語言(XML)是一種流行的人類可讀和機器可讀的標記語言。 XML 的設計目標強調互聯網的簡單性,通用性和可用性。 它是一種文本數據格式,并通過 Unicode 對不同的人類語言提供了強大的支持。 XML 最初是為大規模電子出版而設計的,被廣泛用于在軟件組件,系統和企業之間交換各種數據。 XML 是由萬維網聯盟(W3C)開發的行業標準。 它不受任何編程語言或軟件供應商的束縛。 XML 是可擴展的,與平臺無關的,并且支持國際化。 ## JAXB 用于 XML 綁定的 Java 架構(JAXB)提供了 API 和工具,可自動執行 XML 文檔和 Java 對象之間的映射。 JAXB 允許將 XML 內容解組為 Java 表示形式,訪問和更新 Java 表示形式,并將 XML 內容的 Java 表示形式編組為 XML 內容。 ## Java Servlet Servlet 是 Java 類,可響應特定類型的網絡請求-最常見的是 HTTP 請求。 Java servlet 用于創建 Web 應用。 它們在 servlet 容器(例如 Tomcat 或 Jetty)中運行。 現代 Java Web 開發使用在 servlet 之上構建的框架。 ## Java Servlet 服務 XML 示例 在下面的 Web 應用中,我們從 MySQL 表加載數據并將其顯示為 XML 到客戶端。 我們使用 JAXB 解析器將 Java 類轉換為 XML。 `cars_mysql.sql` ```java -- SQL for the Cars table CREATE TABLE Cars(Id BIGINT PRIMARY KEY AUTO_INCREMENT, Name VARCHAR(150), Price INTEGER); INSERT INTO Cars(Name, Price) VALUES('Audi', 52642); INSERT INTO Cars(Name, Price) VALUES('Mercedes', 57127); INSERT INTO Cars(Name, Price) VALUES('Skoda', 9000); INSERT INTO Cars(Name, Price) VALUES('Volvo', 29000); INSERT INTO Cars(Name, Price) VALUES('Bentley', 350000); INSERT INTO Cars(Name, Price) VALUES('Citroen', 21000); INSERT INTO Cars(Name, Price) VALUES('Hummer', 41400); INSERT INTO Cars(Name, Price) VALUES('Volkswagen', 21600); ``` 該 SQL 腳本在 MySQL 中創建`Cars`表。 ```java $ tree . ├── nb-configuration.xml ├── pom.xml └── src ├── main │ ├── java │ │ └── com │ │ └── zetcode │ │ ├── converter │ │ │ └── CarsXmlConverter.java │ │ ├── dao │ │ │ ├── CarsDAO.java │ │ │ └── ICarsDAO.java │ │ ├── model │ │ │ ├── Car.java │ │ │ └── CarList.java │ │ ├── service │ │ │ ├── CarsService.java │ │ │ └── ICarsService.java │ │ ├── util │ │ │ └── ServiceLocator.java │ │ └── web │ │ ├── GetCar.java │ │ └── GetCars.java │ ├── resources │ └── webapp │ ├── index.html │ ├── META-INF │ │ └── context.xml │ └── WEB-INF └── test └── java ``` 這是項目結構。 `pom.xml` ```java <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zetcode</groupId> <artifactId>JavaServletServeXml</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <name>JavaServletServeXml</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.45</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.3</version> <configuration> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration> </plugin> </plugins> </build> </project> ``` 這是 Maven POM 文件。 `javax.servlet-api`工件用于 servlet。 `spring-jdbc`依賴項用于`JdbcTemplate`庫,該庫簡化了 Java 中的數據庫編程。 `mysql-connector-java`是 Java 語言的 MySQL 驅動程序。 `maven-war-plugin`負責收集 Web 應用的所有工件依賴項,類和資源,并將它們打包到 Web 應用存檔(WAR)中。 `context.xml` ```java <?xml version="1.0" encoding="UTF-8"?> <Context path="/JavaServletServeXml"> <Resource name="jdbc/testdb" auth="Container" type="javax.sql.DataSource" username="user12" password="s$cret" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/testdb" maxActive="10" maxIdle="4"/> </Context> ``` 在 Tomcat `context.xml`文件中,我們定義了上下文路徑和 MySQL 數據源。 `Car.java` ```java package com.zetcode.model; import java.util.Objects; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; @XmlRootElement(name = "car") @XmlType(propOrder = {"id", "name", "price"}) public class Car { private Long id; private String name; private int price; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } @Override public int hashCode() { int hash = 7; hash = 79 * hash + Objects.hashCode(this.id); hash = 79 * hash + Objects.hashCode(this.name); hash = 79 * hash + this.price; return hash; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final Car other = (Car) obj; if (this.price != other.price) { return false; } if (!Objects.equals(this.name, other.name)) { return false; } return Objects.equals(this.id, other.id); } } ``` `Car` bean 從`Cars`數據庫表中保留一行。 ```java @XmlRootElement(name = "car") @XmlType(propOrder = {"id", "name", "price"}) ``` 使用`@XmlRootElement`注解,我們設置元素的名稱。 `@XmlType`用于設置元素標簽的生成順序。 `CarList.java` ```java package com.zetcode.model; import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(namespace = "com.zetcode") @XmlAccessorType(XmlAccessType.FIELD) public class CarList { @XmlElementWrapper(name = "cars") @XmlElement(name = "car") private List<Car> cars; public List<Car> getCars() { return cars; } public void setCars(List<Car> cars) { this.cars = cars; } } ``` `CarList`是一個幫助器類,其中包含 JAXB 映射注解,以在 XML 輸出中的汽車標簽周圍創建包裝器。 ```java @XmlElementWrapper(name = "cars") ``` `@XmlElementWrapper`注解在列表中的元素周圍創建了一個包裝。 ```java @XmlElement(name = "car") ``` `@XmlElement`注解設置包裝元素的名稱。 `ServiceLocator.java` ```java package com.zetcode.util; import java.util.logging.Level; import java.util.logging.Logger; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; public class ServiceLocator { public static DataSource getDataSource(String jndiName) { Context ctx = null; DataSource ds = null; try { ctx = new InitialContext(); ds = (DataSource) ctx.lookup(jndiName); } catch (NamingException ex) { Logger.getLogger(ServiceLocator.class.getName()).log( Level.SEVERE, null, ex); } return ds; } } ``` `ServiceLocator`通過給定的 JNDI 名稱查找數據源,并將其返回給調用方。 `ICarsService.java` ```java package com.zetcode.service; import com.zetcode.model.Car; import java.util.List; public interface ICarsService { public Car findCarById(long id); public List<Car> findAllCars(); } ``` `ICarsService`包含兩種服務合同方法:`findCarById()`和`findAllCars()`。 `CarsService.java` ```java package com.zetcode.service; import com.zetcode.dao.CarsDAO; import com.zetcode.model.Car; import java.util.List; public class CarsService implements ICarsService { private CarsDAO carsDao; public CarsService() { carsDao = createDao(); } @Override public Car findCarById(long id) { Car car = carsDao.findById(id); return car; } @Override public List<Car> findAllCars() { List<Car> cars = carsDao.findAll(); return cars; } private CarsDAO createDao() { carsDao = new CarsDAO(); return carsDao; } } ``` `CarsService`包含`ICarsService`接口的實現。 服務類調用 DAO 對象的方法,該對象是數據庫的中間層。 `ICarsDAO.java` ```java package com.zetcode.dao; import com.zetcode.model.Car; import java.util.List; public interface ICarsDAO { public Car findById(long id); public List<Car> findAll(); } ``` 在這里,我們有 DAO 合同方法。 `CarsDAO.java` ```java package com.zetcode.dao; import com.zetcode.model.Car; import com.zetcode.util.ServiceLocator; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.sql.DataSource; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; public class CarsDAO implements ICarsDAO { private JdbcTemplate jtm; public CarsDAO() { createJdbcTemplate(); } @Override public Car findById(long id) { String sql = "SELECT * FROM Cars WHERE Id=?"; Car car = new Car(); try { car = (Car) jtm.queryForObject(sql, new Object[]{id}, new BeanPropertyRowMapper(Car.class)); } catch (EmptyResultDataAccessException ex) { Logger.getLogger(CarsDAO.class.getName()).log( Level.SEVERE, null, ex); } return car; } @Override public List<Car> findAll() { String sql = "SELECT * FROM Cars"; List<Car> cars = new ArrayList<>(); try { cars = jtm.query(sql, new BeanPropertyRowMapper(Car.class)); } catch (EmptyResultDataAccessException ex) { Logger.getLogger(CarsDAO.class.getName()).log( Level.SEVERE, null, ex); } return cars; } private JdbcTemplate createJdbcTemplate() { DataSource ds = ServiceLocator.getDataSource("java:comp/env/jdbc/testdb"); jtm = new JdbcTemplate(ds); return jtm; } } ``` `CarsDAO`包含 DAO 方法的實現。 我們使用 Spring 的`JdbcTemplate`模塊訪問數據庫。 ```java private JdbcTemplate createJdbcTemplate() { DataSource ds = ServiceLocator.getDataSource("java:comp/env/jdbc/testdb"); jtm = new JdbcTemplate(ds); return jtm; } ``` 在`createJdbcTemplate()`方法中,我們查找數據源并創建`JdbcTemplate`。 `CarsXmlConverter.java` ```java package com.zetcode.converter; import com.zetcode.model.Car; import com.zetcode.model.CarList; import java.io.ByteArrayOutputStream; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; public class CarsXmlConverter { private ByteArrayOutputStream bos; public ByteArrayOutputStream convertList(List<Car> cars) { bos = new ByteArrayOutputStream(); try { JAXBContext context = JAXBContext.newInstance(CarList.class); Marshaller m = context.createMarshaller(); m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); CarList carsList = new CarList(); carsList.setCars(cars); m.marshal(carsList, bos); } catch (JAXBException ex) { Logger.getLogger(CarsXmlConverter.class.getName()).log(Level.SEVERE, null, ex); } return bos; } public ByteArrayOutputStream convertObject(Car car) { bos = new ByteArrayOutputStream(); try { JAXBContext context = JAXBContext.newInstance(Car.class); Marshaller m = context.createMarshaller(); m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); m.marshal(car, bos); } catch (JAXBException ex) { Logger.getLogger(CarsXmlConverter.class.getName()).log(Level.SEVERE, null, ex); } return bos; } } ``` `CarsXmlConverter`包含將 Java 類轉換為 XML 數據的方法。 ```java public ByteArrayOutputStream convertList(List<Car> cars) { ``` 該方法返回`ByteArrayOutputStream`。 ```java JAXBContext context = JAXBContext.newInstance(CarList.class); Marshaller m = context.createMarshaller(); m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); ``` 創建了 JAXB 編組器。 ```java CarList carsList = new CarList(); carsList.setCars(cars); m.marshal(carsList, bos); ``` 我們將 Java 表示形式編組為`ByteArrayOutputStream`。 `GetCars.java` ```java package com.zetcode.web; import com.zetcode.converter.CarsXmlConverter; import com.zetcode.model.Car; import com.zetcode.service.CarsService; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.List; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet(name = "GetCars", urlPatterns = {"/GetCars"}) public class GetCars extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("application/xml;charset=UTF-8"); CarsService carsService = new CarsService(); List<Car> cars = carsService.findAllCars(); CarsXmlConverter xmlConverter = new CarsXmlConverter(); try (ByteArrayOutputStream bos = xmlConverter.convertList(cars)) { OutputStream os = response.getOutputStream(); bos.writeTo(os); } } } ``` `GetCars` Servlet 將`Cars`表中的所有數據作為 XML 數據返回。 ```java @WebServlet(name = "GetCars", urlPatterns = {"/GetCars"}) ``` Java 類用`@WebServlet`注解修飾。 它映射到`GetCars` URL 模式。 ```java response.setContentType("application/xml;charset=UTF-8"); ``` Servlet 將以 XML 輸出數據,并且數據的編碼設置為 UTF-8。 ```java CarsService carsService = new CarsService(); List<Car> cars = carsService.findAllCars(); ``` 使用`CarsService`的`findAllCars()`,我們從數據庫中檢索所有汽車。 ```java CarsXmlConverter xmlConverter = new CarsXmlConverter(); try (ByteArrayOutputStream bos = xmlConverter.convertList(cars)) { OutputStream os = response.getOutputStream(); bos.writeTo(os); } ``` 我們使用`CarsXmlConverter`將數據轉換為 XML,并將字節寫入`ServletOutputStream`。 `GetCar.java` ```java package com.zetcode.web; import com.zetcode.converter.CarsXmlConverter; import com.zetcode.model.Car; import com.zetcode.service.CarsService; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.List; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet(name = "GetCar", urlPatterns = {"/GetCar"}) public class GetCar extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { long id = Long.parseLong(request.getParameter("carId")); response.setContentType("application/xml;charset=UTF-8"); CarsService carsService = new CarsService(); Car car = carsService.findCarById(id); CarsXmlConverter xmlConverter = new CarsXmlConverter(); try (ByteArrayOutputStream bos = xmlConverter.convertObject(car)) { OutputStream os = response.getOutputStream(); bos.writeTo(os); } } } ``` `GetCar` Servlet 以 XML 格式返回一輛汽車。 `index.html` ```java <!DOCTYPE html> <html> <head> <title>Home page</title> <meta charset="UTF-8"> </head> <body> <a href="GetCars">Get cars</a> <br> <a href="GetCar?carId=5">Get car with id 5</a> </body> </html> ``` 這是主頁。 它包含兩個鏈接。 一個檢索所有汽車,另一個檢索具有 ID 5 的汽車。 在本教程中,我們創建了一個 Java Web 應用,該應用從 MySQL 數據庫中選擇數據,將其轉換為 XML,然后將 XML 數據返回給客戶端。 您可能也對以下相關教程感興趣: [Java Servlet 焊接教程](/articles/javaservletweld/), [Java Servlet 上傳文件](/articles/javaservletuploadfile/), [Java Log4j 教程](/java/log4j/), [Java Servlet RESTful 客戶端](/articles/javaservletrestclient/) , [Java `RequestDispatcher`](/java/requestdispatcher/) ,[從 Java Servlet 提供純文本](/articles/javaservlettext/) , [Java Servlet 圖像教程](/articles/javaservletimage/)或 [Java 教程](/lang/java/)。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看