Không Tên Phần 1
Con cũ là hệ thống quản lý order PC. Vậy con mới thêm vào chức năng mới là thêm vào con này a.
Có vẻ như không phải.
Công nghệ:
(OK) - Maven
(OK) - JitPack: To get a Git project into your build: JitPack là gì? -> com.github.kenglxn.qrgen: QR code gì đó.
(OK) - JUnit
(OK) - Servlet
- Struts2
- Digester : Cấu hình xml và java obj
(OK) - JSON.simple: Đọc và ghi file Json. Bạn có thể dùng Jackson 2 hoặc Gson để thay thế.
- Spring-struts2, Spring-orm.
(OK) - ibatis: MyBatis là một persistence framework mã nguồn mở, đơn giản, gọn nhẹ và dễ sử dụng.
MyBatis cung cấp các API giúp thao tác với Database dễ dàng hơn.
Nó tự động ánh xạ giữa các trường của bảng trong cơ sở dữ liệu SQL và các trường trong Java POJOs (Plain Old Java Objects) theo tên trường.
Các câu lệnh SQL ánh xạ được định nghĩa trong file mapper XML hoặc Annotations.
- log4j
- Apache POI: là một thư viện mã nguồn mở Java, được cung cấp bởi Apache, nó là một thư viện đầy sức mạnh giúp bạn làm việc với các tài liệu của Microsoft như Word, Excel, Power point, Visio,...
(OK) - jxl: Jxl là một gói thư viện cho phép chúng ta tương tác với Excel như đọc, ghi,..,
- jstl
- Gson: Gson là một thư viện java của google cho phép người sử dụng có thể chuyển đổi từ một đối tượng Java sang JSON và cũng có thể chuyển đổi từ một đối tượng JSON sang java.
Gson có thể làm việc với đối tượng java tùy ý bao gồm các đối tượng tồn tại sẵn mà bạn không có source-code của chúng.
- jurt: Java Uno RunTime
- com.notnoop.apns: java-apns is a Java client for Apple Push Notification service (APNs).
(OK) - javax.mail
(Không cần vội lắm )- Tomcat 7
(Không cần vội lắm )- Oracle
(Không cần vội lắm )- jQuery
(Không cần vội lắm )- Bootstrap
------------------------------Tìm hiểu----------------------------------------------------
Mybatis là gì?
Nằm giữa tầng application và database. Đóng vai trò như 1 tầng trung gian. Hỗ trợ SQL, stored procedure và các ánh xạ khác. Nhiệm vụ của nó là ánh xạ các properties của POJO và columns trong db
Gần giống như là ORM vậy. Nó che giấu đi JDBC code, việc cấu hình truy vấn và kết quả trả về được thực hiện bới Annotation hoặc file cấu hình XML. Nó không phải là 1 ORM.
Eclipse KEPLER SR2
MySQL 5.0.11
JDK 1.8
MyBatis 3.3.0
Spring 4.3.6
B1. Tạo file application.properties.
B2. Tạo bảng student
B3. Tạo entity Student(POJO)
B4. Ibatis: Tạo mapper Student.xml để map trường và cột. 1 interface StudentMapper để call Student.xml method
B5. Tạo SqlMapConfig.xml để map Entity và mapper Student.xml
B6. Tạo appconfig để đọc cấu hình của *.properties, SqlMapConfig.xml, Scan các mapper.
B7. Tạo service Impl để sử dụng studentMapper call các service tương ứng.
B8. Test
Với mapper thì có thể sử dụng annotation hoặc xml để cấu hình sql thực thi
---------------- Xây dựng 1 ứng dụng MyBatis --------------------------------------------
B1. Tạo bảng
B2. Add thêm vào thư viện
Tạo entity tương ứng(bean)
B3. Xây dựng file config trong src/resource: Chỉ ra các bean và mapper file tương ứng.(Nếu sử dụng annotation thì không cần thiết)
B4. Xây dựng interface mapper.
B5. Nếu dùng xml configuration thì tạo file: Ví dụ: Student.xml sẽ chỉ ra namespace là mapper tương ứng
B6. Tạo lớp test
xml configuration file.
<configuration>
<typeAliases>
<typeAlias alias = "class_alias_Name" type = "absolute_clas_Name"/>
</typeAliases>
<environments default = "default_environment _name">
<environment id = "environment_id">
<transactionManager type = "JDBC/MANAGED"/>
<dataSource type = "UNPOOLED/POOLED/JNDI">
<property name = "driver" value = "database_driver_class_name"/>
<property name = "url" value = "database_url"/>
<property name = "username" value = "database_user_name"/>
<property name = "password" value = "database_password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource = "path of the configuration XML file"/>
</mappers>
</configuration>
resource thì dùng dấu / còn class thì dùng dấu .
1. Cấu hình Mybatis sử dụng XML file
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias alias = "class_alias_Name" type = "absolute_clas_Name"/>
</typeAliases>
<environments default = "default_environment _name">
<environment id = "environment_id">
<transactionManager type = "JDBC/MANAGED"/>
<dataSource type = "UNPOOLED/POOLED/JNDI">
<property name = "driver" value = "database_driver_class_name"/>
<property name = "url" value = "database_url"/>
<property name = "username" value = "database_user_name"/>
<property name = "password" value = "database_password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource = "abc/../Student.xml"/> -- Mapper bằng xml
// <mapper class = "abc.classMapper"/> -- Mapper bằng annotation nằm trong mapper class
</mappers>
</configuration>
- <environments> : cấu hình thông tin kết nối tới database. Có thể cấu hình cho Mybatis kết nối tới nhiều db bằng cách sử dụng thẻ con <environment> bên trong thẻ <environments>
Để cấu hình môi trường kết nối database: Có 2 thẻ con là <transactionManager> và <dataSource>
- <transactionManager>: JDBC/MANAGED: Nếu chúng ta sử dụng trình quản lý transaction kiểu JDBC, ứng dụng sẽ đáp ứng được các hoạt động quản lý transaction như commit, roll-back, ...
Nếu chúng ta sử dụng trình quản lý transaction kiểu MANAGED, máy chủ ứng dụng sẽ đáp ứng việc quản lý vòng đời của các connection. Nó thường được sử dụng với các ứng dụng Web.
- <dataSource>: Cấu hình kết nối tới db. Có 3 kiểu
+ UNPOOLED: Đối với dataSource có kiểu là UNPOOLED, MyBatis chỉ đơn giản là mở và đóng một kết nối cho mỗi thao tác với database.
Nó chậm hơn một chút và thường được sử dụng cho các ứng dụng đơn giản.
+ POOLED: Đối với dataSource có kiểu là POOLED, MyBatis sẽ duy trì một pool các connection.
Đối với mọi thao tác cơ sở dữ liệu, MyBatis sử dụng một trong những connection này và trả lại connection cho pool sau khi hoàn thành thao tác.
Nó làm giảm kết nối cần phải khởi tạo và thời gian xác thực cần thiết để tạo ra một kết nối mới.
+ JNDI - Đối với dataSource có kiểu là JNDI, MyBatis sẽ nhận được kết nối từ nguồn dữ liệu JNDI.
-<typeAliases> Thay vì chỉ định tên lớp tuyệt đối ở mọi nơi, tạo ra 1 alias thay thế.
2. Cấu hình file mapper xml
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace = "alias/interface">
//mapped statements và result maps
<mapper>
<insert id = "insertStudent" parameterType = "Student">
INSERT INTO STUDENT1 (NAME, BRANCH, PERCENTAGE, PHONE, EMAIL )
VALUES (#{name}, #{branch}, #{percentage}, #{phone}, #{email});
</insert>
//giả sử session là một đối tượng SqlSession.
session.insert("Student.insertStudent", student);
session.commit();
Gọi không thông qua class/interface mapper cũng được à?
-> Được.
Student student = session.selectOne("Student.getStudentById", 2);
<mapper>
<select>
Select * From Student
</select>
<select>
Select * From Student Where ID = #{id}
</select>
namespace="Student" có thể là bất kì: Student1 cũng chạy được.
Mỗi câu lệnh có id duy nhât, để thực thi bất kỳ câu lệnh nào bạn phải tuyền id tương ứng tới phương thức trong ứng dụng Java.
File mapper XML được sử dụng nhằm giảm thiểu việc phải viết câu lệnh SQL lặp lại nhiều lần. So với JDBC, khoảng 95% code được giảm bằng cách sử dụng tệp Mapper XML trong MyBatis.
Tất cả các câu lệnh SQL được đặt trong thẻ <mapper>, thẻ này có một thuộc tính được gọi là 'namespace'.
- resultMap: Thẻ resultMap là thẻ quan trọng và mạnh mẽ nhất.
Thẻ resultMap được sử dụng để ánh xạ tên cột trong tập dữ liệu trả về từ câu lệnh SELECT với tên trường của đối tượng Java (Beans/POJO).
Câu hỏi: Có cần thiết phải sử dụng resultMap để ánh xạ dữ liệu trả về của câu lệnh SELECT vào đối tượng Java (Beans/POJO)?
TH: Khi các tên cột trong tập dữ liệu trả về từ database trùng với tên trường của đối tượng java thì không cần phải sử dụng resultMap.
Chẳng hạn trong ví dụ về câu lệnh select trên có thể khai báo như sau. Không cần sử dụng resultMap vì các tên cột trong database trùng với các tên trường của đối tượng java.
<select id = "getAll" resultType = "Student">
SELECT * FROM STUDENT;
</select>
3. Mybatis - Annotation
Từ MyBatis 3, MyBatis cũng cung cấp các annotation để định nghĩa các câu lệnh SQL.
Khi sử dụng các annotation thay vì file cấu hình XML, chúng ta có thể sử dụng một interface trong java đinh nghĩa và thực thi các câu truy vấn SQL dựa trên các annotaion.
Dưới đây là các ví dụ.
// insert student
final String INSERT_STUDENT = "INSERT INTO STUDENT (NAME, BRANCH, PERCENTAGE, PHONE, EMAIL ) "
+ "VALUES (#{name}, #{branch}, #{percentage}, #{phone}, #{email})";
@Update(INSERT_STUDENT)
@Options(useGeneratedKeys = true, keyProperty = "id")
public void insert(Student student);
final String GET_ALL_STUDENT = "SELECT * FROM STUDENT";
@Select(GET_ALL_STUDENT)
@Results(value = { @Result(property = "id", column = "ID"),
@Result(property = "name", column = "NAME"),
@Result(property = "branch", column = "BRANCH"),
@Result(property = "percentage", column = "PERCENTAGE"),
@Result(property = "phone", column = "PHONE"),
@Result(property = "email", column = "EMAIL") })
public List<Student> getAll();
- Mybatis - Procedure
Bạn có thể gọi một stored procedure trong MyBatis, đầu tiên chúng ta phải tạo stored procedure trong MySQL.
Tạo 1 procedure:
DELIMITER //
DROP PROCEDURE IF EXISTS details.read_recordById //
CREATE PROCEDURE details.read_recordById (IN student_id INT)
BEGIN
SELECT * FROM STUDENT WHERE ID = student_id;
END//
DELIMITER ;
Để ánh xạ với kết quả trả về của các thủ tục, chúng ta cần phải tạo một resultmap có kiểu alias là Student (mybatis.mapper.entity.Student).
Để gọi thủ tục read_recordById, chúng ta cần định nghĩa thẻ select có id là callById.
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper>
<resultMap>
<result />
<result />
<result />
<result />
<result />
<result />
</resultMap>
<select>
{call read_recordById(#{id, jdbcType = INTEGER, mode = IN})}
</select>
</mapper>
Code test:
// get student by Id
Student student = session.selectOne("Student.readRecordById", 12);
System.out.println(student);
3. Mybatis: Dynamic SQL
Là 1 đặc tính mạnh mẽ của MyBatis. Nó cho phép xây dựng nên các câu lệnh truy vấn động. Ví dụ muốn tìm kiếm dựa vào tên, tuổi của sinh viên.
Để có thể sử dụng Dynamic SQL. Mybatis cung cấp các mệnh đề
if
choose (when, otherwise)
trim (where, set)
foreach
- if:
<select id = "getStudentByName" parameterType = "Student" resultType = "Student">
SELECT * FROM STUDENT
<if test = "name != null">
WHERE name LIKE #{name}
</if>
</select>
- choose
<select id = "getStudentByName_Id_phone" parameterType = "Student" resultType = "Student">
SELECT * FROM Student WHERE id != 0
<choose>
<when test = "name != null">
AND name LIKE #{name}
</when>
<when test = "phone != 0">
AND phone LIKE #{phone}
</when>
</choose>
</select>
- where
<select id = "getStudentByName_Id_phone" parameterType = "Student" resultType = "Student">
SELECT * FROM STUDENT
<where>
<if test = "id != 0">
id = #{id}
</if>
<if test = "name != null">
AND name LIKE #{name}
</if>
</where>
</select>
- foreach where in:
<select id = "selectPostIn" resultType = "domain.blog.Post">
SELECT *
FROM POST P
WHERE ID in
<foreach item = "item" index = "index" collection = "list"
open = "(" separator = "," close = ")">
#{item}
</foreach>
</select>
-- So sánh hibernate và MyBatis
MyBatis không là ORM.
MyBatis Hibernate
MyBatis đơn giản và gọn nhẹ hơn. Hibernate sinh ra SQL cho bạn, nghĩa là bạn không phải tốn thời gian viết SQL.
MyBatis linh hoạt hơn, giúp thời gian phát triển nhanh hơn. Hibernate có khả năng mở rộng cao, cung cấp bộ nhớ cache tiên tiến hơn.
MyBatis sử dụng SQL, là csdl phụ thuộc. Hibernate sử dụng HQL, tương đối độc lập với csdl. Chuyển đổi db thành Hibernate dễ dàng hơn.
MyBatis ánh xạ ResultSet từ JDBC API đến POJO Objects của bạn, vì vậy bạn không cần phải quan tâm đến các cấu trúc bảng. Hibernate ánh xạ các đối tượng Java POJO của bạn với các bảng.
Sử dụng stored procedure trong MyBatis dễ hơn. Sử dụng stored procedure trong Hibernate khó hơn.
http://www.mybatis.org/mybatis-3/index.html
1. Để sử dụng MyBatis trong maven:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
2. Building SqlSessionFactory từ XML file
- có thể thu được từ việc sủ dụng SqlSessionFactoryBuilder. SqlSessionFactoryBuilder sẽ đọc thông tin từ 1 file xml configuration để build 1 SqlSessionFactory.
Việc này là hết sức đơn giản.
Bạn có thể sử dụng 1 instance của InputStream hoặc Reader để đọc thông tin trong file cấu hình: Ví dụ cho 2 cách đọc
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// Reader reader = Resources.getResourceAsReader("ConfigApp.xml");
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(inputStream);
Những file cấu hình xml này chứa thông tin về cách thức truy nhập database, về transactionManager. Ví dụ:
<?xml ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments>
<environment>
<transactionManager/>
<dataSource>
<property/>
<property/>
<property/>
<property/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper/>
</mappers>
</configuration>
The mappers element contains a list of mappers - the XML files and/or annotated Java interface classes that contain the SQL code and mapping definitions.
<mappers> chứa 1 list các mapper. Các xml filse và hoặc các java interface có chưa các mã Sql và thông tin mapping.
Building SqlSessionFactory without XML: Bỏ qua
3. Thu được SqlSession từ SqlSessionFactory
SqlSession chứa các method cần thiết để thực thi SQL command. Ví dụng
SqlSession session = sqlSessionFactory.openSession();
try {
Blog blog = session.selectOne(
"org.mybatis.example.BlogMapper.selectBlog", 101);
} finally {
session.close();
}
Từ Mybatis thì cách dùng có gọn gàng hơn. Đó là sử dụng 1 interface, ví dụ BlogMapper để mô tả tham số và dữ liệu trả về của câu lệnh truy vấn. Ví dụ:
SqlSession session = sqlSessionFactory.openSession();
try {
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
} finally {
session.close();
}
4. Mapped SQL Statement
Vào thời điểm này thì có thể bạn sẽ băn khoăn chính xác thì cái gì được thực thi bới SqlSession hoặc Mapped class.
<?xml ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper>
<select>
select * from Blog where id = #{id}
</select>
</mapper>
Có 2 cách khác nhau để gọi thực thi đoạn code này.
C1: Blog blog = session.selectOne(
"org.mybatis.example.BlogMapper.selectBlog", 101);
C2: Tạo ra 1 mapper class cùng tên với namespace trong mapper xml file configuration
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
Cách 2 có rất nhiều ưu điểm. Nó không phụ thuộc vào 1 String literal nào. Vì thế nó sẽ safer
Có 1 mẹo nhỏ: mapped statement sql có thể được sử dụng trong Mapper class sử dụng anotation. Ví dụng
package org.mybatis.example;
public interface BlogMapper {
@Select("SELECT * FROM blog WHERE id = #{id}")
Blog selectBlog(int id);
}
Java anotation có giới hạn và sẽ khó hiểu nên nếu đó là 1 cậu lệnh phức tập.
5. SqlSessionFactoryBuilder
1 khi đã tạo ra sqlSessionFactory thì ko cần phải keep sqlSessionFactoryBuild
6. SqlSessionFactory: 1 khi đã được tạo, nó nên được tồn tại trong suốt quá trình thực thi app.
7 SqlSession: Mỗi thread nên có 1 instance riêng của SqlSession. Thể hiện của nó không được chia sẽ và không phải là thread safe. Scope của nó nên là method. Không bao giờ được giữ tham chiếu của 1 SqlSession instance
dưới dạng 1 static filed hoặc 1 field instance của class.
SqlSession session = sqlSessionFactory.openSession();
try {
// do work
} finally {
session.close();
}
8. Mapped instances
- là các interface sử dụng để tạo ra các đoạn thực thi mapped statement. Phạm vi của nó nên là method scope. Nó nên được dùng như sau:
SqlSession session = sqlSessionFactory.openSession();
try {
BlogMapper mapper = session.getMapper(BlogMapper.class);
// do work
} finally {
session.close();
}
----------------------------------------jxl---------------------------------------------
Sử dụng JExcel API, 1 thư viện đơn giản được sử dụng rộng rãi cho các thao tác cơ bản như sửa, tạo các tập tin excel.
https://www.teamdev.com/downloads/jexcel/docs/JExcel-PGuide.html
jxl không hỗ trợ cho định dạng xlsx. Nó ít được update hơn so với apache poi.
// https://stackoverflow.com/questions/14980717/what-is-the-better-api-to-reading-excel-sheets-in-java-jxl-or-apache-poi
https://github.com/tienph91/jxl
----------------------------------------JitPack--------------------------------------------
JitPack là gì?
https://github.com/jitpack
Dễ dàng sử dụng các package repository. JitPack builds các project trên github và chuyển nó thành các .jar có thể sử dụng như các thư viện.
Nếu bạn muốn thư viện của mình to be available với thế giới. Chỉ cần xây dựng project của mình và upload lên github. JitPack sẽ lo phần còn lại.
Để sử dụng nó ta làm như sau: https://jitpack.io/
Step1: add Jitpack repository vào file pom.
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
Step2: add dependency
<dependency>
<groupId>com.github.User</groupId>
<artifactId>Repo</artifactId>
<version>Tag</version>
</dependency>
Lần đầu tiên khi request 1 project JitPack sẽ checkout code, build nó và trả nó về dạng .jar, .aar
----------------------------------------Spring--------------------------------------------
Phát triển dựa trên mô hình POJO-based
Tổ chức theo kiểu module.
Các đặc tính nổi bật:
1. DI và IOC?
- DI: giảm bớt sự phụ thuộc mà lập trình tạo ra. Lỏng lẻo sự phụ thuộc
Ví dụ:
- Không sử dụng DI
public class Student {
private Service service;
public Student() {
service = new FlyService();
}
}
- Sử dụng DI(Constructor)
public class Student {
private Service service;
// constructor được sử dụng để truyền dependency
public Student(Service service;) {
this.service; = service;
}
}
- Sử dụng DI(Thông qua setter)
public class Student {
private Service service;
// phương thức setter được sử dụng để truyền dependency
public void setAddress(Service service;) {
this.service = service;
}
// phương thức getter trả về đối tượng address
public Address getAddress() {
return service;
}
}
- IOC: Khởi tạo, configure, gắn kết các đối tượng.
2. Các module của spring framework
- Có khoảng 20 module được chia vào các nhóm khác nhau. Core container, Data access/Integration, Web, AOP, Instrumentation, Messaging, Test.
Core Container:
Core Container bao gồm các module: spring-core , spring-beans, spring-context, springcontext-support, và spring-expression (Spring Expression Language).
- IoC Container trong spring: Là thành phần cốt lõi của spring framework. IoC Container sẽ tạo ra các đối tượng, kết nối chúng lại với nhau, cấu hình chúng, quản lý vòng đời từ
lúc nó được tạo ra đến khi bị hủy. IoC Container sử dụng DI để quản lý các thành phần tạo nên 1 ứng dụng. Những đối tượng này gọi là spring bean. IoC được cung cấp thông tin
từ tập tin XML.
Có 2 loại IoC container, đó là:
1. BeanFactory
2. ApplicationContext
1.BeanFactory: được implement bởi XmlBeanFactory. Để sử dụng BeanFactory ta phải tạo ra thể hiện của XmlBeanFactory như dưới đây.
Resource resource = new ClassPathResource("applicationContext.xml");
BeanFactory factory = new XmlBeanFactory(resource);
2. ApplicationContext
ClassPathXmlApplicationContext là lớp thực thi của giao diện ApplicationContext. Chúng ta sẽ tạo ra thể hiện của nó.
ApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
Constructor của ClassPathXmlApplicationContext nhận tham số truyền vào là 1 chuỗi, vì vậy chúng ta truyền tên của tập tin xml để tạo ra thể hiện của ApplicationContext.
3. Định nghĩa bean trong spring
Các đối tượng là xương sống của ứng dụng và được quản lý bởi spring IoC container được gọi là Bean. 1 bean là 1 đối tượng được khởi tạo, quản lý. Các bean này được tạo ra bằng siêu
dữ liệu mà bạn cung cấp cho container, ví dụ dưới dạng định nghĩa XML <bean/>
Các thuộc tính định nghĩa bean trong spring.
1 định nghĩa bean sẽ phải cung cấp cho container cách để biết những điều sau đây.
- Làm thế nào để tạo ra 1 bean.
- Chi tiết vòng đời của bean.
- Phụ thuộc của bean.
1
class
Thuộc tính này là bắt buộc và chỉ định lớp được sử dụng để tạo ra bean.
2
name
Thuộc tính này chỉ định duy nhất nhận dạng bean. Trong siêu dữ liệu cấu hình dựa trên XML, bạn sử dụng các thuộc tính id và (hoặc) name để chỉ định bean duy nhất.
3
scope
Thuộc tính này xác định phạm vi của các đối tượng được tạo ra từ một định nghĩa bean cụ thể.
4
constructor-arg
Thuộc tính này được sử dụng để bơm các phụ thuộc (dependency).
5
properties
Thuộc tính này được sử dụng để bơm các phụ thuộc (dependency).
6
Chế độ autowiring
Thuộc tính này được sử dụng để bơm các phụ thuộc (dependency).
7
Chế độ lazy-initialization
Thuộc tính này nói cho IoC container biết được rằng đối tượng này được tạo ra tại thời điểm được request, chứ không phải lúc khởi động.
8
Phương thức initialization
Một callback được gọi ngay sau khi tất cả các thuộc tính cần thiết trên bean đã được thiết lập bởi container.
9
Phương thức destruction
Một callback được sử dụng khi container chứa bean bị hủy.
Làm thế nào để cung cấp siêu dữ liệu cấu hình cho spring ioc container?
-> Có 3 phương pháp quan trọng để cung cấp siêu dữ liệu cấu hình cho spring ioc container:
- Tệp tin cấu hình xml
- Annotation
- Cấu hình dựa trên java
Dưới đây là một số ví dụ định nghĩa bean dựa trên XML.
view sourceprint?
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- Một định nghĩa bean đơn giản -->
<bean id = "..." class = "...">
<!-- Cấu hình bean tại đây -->
</bean>
<!-- Một định nghĩa bean với chế độ lazy-init -->
<bean id = "..." class = "..." lazy-init = "true">
<!-- Cấu hình bean tại đây -->
</bean>
<!-- Một định nghĩa bean với phương thức khởi tạo -->
<bean id = "..." class = "..." init-method = "...">
<!-- Cấu hình bean tại đây -->
</bean>
<!-- Một định nghĩa bean với phương thức hủy -->
<bean id = "..." class = "..." destroy-method = "...">
<!-- Cấu hình bean tại đây -->
</bean>
</beans>
I. Phạm vi của bean trong spring
Khi định nghĩa 1 bean trong spring, sẽ có các tùy chọn để khai báo phạm vi của bean đó. Ví dụ, muốn spring tạo ra 1 bean mới khi dùng thì bạn khiai báo scope của nó là prototype.
Tương tự nếu muốn spring trả về 1 bean(bean duy nhất) khi cần thiết, bạn nên khai báo thuộc tính phạm vi của bean là Singeton.
Spring hỗ trợ 5 phạm vi, 3 trong số đó là khả dụng trong spring web.
1
singleton
Đây là phạm vi mặc định, phạm vi này nói với Spring IoC container rằng chỉ tạo ra một thể hiện duy nhất của bean này trên toàn bộ dứng dụng.
2
prototype
Phạm vi này nói với Spring IoC container rằng tạo ra một thể hiện mới của bean mỗi khi cần thiết.
3
request
Phạm vi này định nghĩa một bean cho một HTTP request. Chỉ có giá trị trong ngữ cảnh của một ứng dụng Spring Web.
4
session
Phạm vi này định nghĩa một bean cho một HTTP session. Chỉ có giá trị trong ngữ cảnh của một ứng dụng Spring Web.
5
global-session
Phạm vi này định nghĩa một bean cho một global HTTP session. Chỉ có giá trị trong ngữ cảnh của một ứng dụng Spring Web.
1. Phạm vi singleton.
Nếu phạm vi của bean là singleton, Spring ioc container sẽ tạo ra chính xác 1 thể hiện của đối tượng được xác định bởi định nghĩa của bean đó. Đối tượng này sẽ được lưu trữ trong
1 bộ nhớ cache, và tất cả các yêu cầu tiếp theo mà tham chiếu đến bean đó thì đối tượng lưu trữ sẽ được trả về.
Phạm vi mặc định luôn là singleton. Tuy nhiên, bạn có thể thiệt lập thuộc tính scope thành singleton trong tệp tin cấu hình bean, ví dụ:
<!-- Một định nghĩa bean với singleton scope -->
<bean id = "..." class = "..." scope = "singleton">
<!-- Cấu hình bean tại đây -->
</bean>
Ví dụ:
package vn.viettuts;
public class HelloWorld {
private String message;
public void setMessage(String message) {
this.message = message;
}
public void getMessage() {
System.out.println("Your Message : " + message);
}
}
<?xml?>
<beans
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean>
</bean>
</beans
// read config information from Beans.xml
ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
HelloWorld helloWorld = (HelloWorld) context.getBean("helloWorld");
System.out.println(helloWorld.getMessage());
helloWorld.setMessage("Msg changed!!!");
HelloWorld helloWorld2 = (HelloWorld) context.getBean("helloWorld");
System.out.println(helloWorld2.getMessage());
Hello : tienph!
Hello : Msg changed!!!
II. Vòng đời của Bean trong spring.
Vòng đời của Bean trong spring bao gồm khởi tạo, sử dụng và kết thúc. Mặc dù có 1 danh sách các hoạt động xảy ra trước và sau khi bean được tạo và hủy nhưng ta sẽ chỉ quan tâm tới
khởi tạo và destroy-method
Có thể chỉ định khi cấu hình siêu dữ liệu cho bean để cung cấp cách thức nó được init và destroy.
III. Kế thừa bean trong spring
- Định nghĩa bean con thừa kế dữ liệu câu hình định nghĩa từ bean cha. Định nghĩa con có thể ghi đè lên 1 số giá trị hoặc thêm các giá trị khác nếu cần.
- Định nghĩa kế thừa bean trong spring không liên quan gì đến kế thừa lớp trong java.
Để sử dụng được điều này khi bạn sử dụng siêu dữ liệu cấu hình dựa trên XML, bạn chỉ định định nghĩa bean con bằng cách sử dụng thuộc tính parent, chỉ định tean của bean cha
làm giá trị của thuộc tính này.
Ví dụ:
<?xml?>
<beans
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean>
<property />
<property />
</bean>
<bean
>
<property />
<property />
</bean>
</beans>
Ngoài ra các parent có thể là các bean abstract(ko thể khởi tạo) đc dùng để làm template cho các bean con khác.
----------------------------------------------------------- Tìm hiểu project ----------------------------------------------
package bl: Xử lý logic
package dao: được gọi bởi bl, truy vấn xuống db.
package form: nhận thông tin được được gửi từ user xuống. Mỗi form sẽ có 1 hàm validate. Khi click submit thì nó sẽ vào validate trước rồi mới gọi xuống method được định nghĩa trong
struts.xml(method trong class action). Method trong class action sẽ được extends từ form này.
package action: Đầu vào của điểm xử lý thông tin. Request của user sẽ được gửi tới đây với điều kiện phải thỏa mãn validate trong form.
Trong struts2, nếu muốn lấy value ở file .properties ở jsp ta làm như sau:
samplePrj.properties
com.samplePrj.Successmessage = Saved Successful
<s:i18n>
<s:text /> // dùng cái này là được.
</s:i18n>
1. <%@ taglib%> là gì?
- Khai báo sử dụng tag của struts2. JSP cho phép bạn định nghĩa các tag JSP của riêng mình giống như là html và xml.
Đây là cú pháp để add thêm các custom tag vào. Prefĩ thì tùy theo mình định nghĩa.
2. Hoàn toàn có thể dùng s:text để thay thế cho s:property
3. <s:url> trong struts2
-> Được dùng để tạo 1 url và output nó ra dưới dạng text format. Nó không làm việc 1 mình, nhưng đóng vai trò cung cấp URL tới tác
khác như <s:a> để tạo 1 hyperlink or <img> để render 1 img.
Ví dụ các case sử dụng chính.
1. Create an image url.
<img src="<s:url/>" />
Output (assume the root context name is "Struts2Example")
<img src="/Struts2Example/images/man.jpg" />
2. Create a "Google" text and link it to http://www.google.com.
<ahttp://www.google.com" />">Google</a>
Output
<a>Google</a>
When you define the URL value with starting of "http" or "www" words, Struts 2 will render it as it is, without add the extra root context name as example 1.
Khi định nghĩa giá trị của url mà bắt đầu bằng http hoặc www, struts2 sẽ render nó mà ko add thêm vào context root giống như trên
3. Create an Action URL with a "id" parameter, and output it as a text format.
<s:url >
<s:param>123</s:param>
</s:url>
Output: /Struts2Example/urlTagAction.action?id=123
4. Create an Action URL with a "name" parameter, and combine with <s:a> tag via <s:property>.
<s:url >
<s:param>mkyong</s:param>
</s:url>
<a#urlTag" />" >URL Tag Action (via property)</a>
Output:
<a >URL Tag Action (via property)</a>
5. Create an Action URL with a "age" parameter, and combine with <s:a> tag via "%{urlTag}".
<s:url >
<s:param>99</s:param>
</s:url>
<s:a>URL Tag Action (via %)</s:a>
Output:
<a>URL Tag Action (via %)</a>
II. Thẻ s:textfield
Dùng giống thử thẻ input trong html
1. Để lấy action name hiện tại trong struts2 ta làm như sau:
String actionName = ActionContext.getContext().getName();
2. UserBean: Kiểu kết quả trả về từ câu lệnh truy vấn. Giống cái result trả về từ ibatis ý.
3. Trong hệ thống: Dùng SystemConmon Class để get properties file.
SystemCommon system = new SystemCommon();
Properties messageProp = system.getProperties("/properties/menu.properties");
4. Redirect Action Result trong struts2
Kết quả trả về sử dụng ActionMapper được cung cấp bởi ActionMapperFactory dùng để redirect browser tới 1 url được chỉ ra bởi 1 action và namespace(optional).
5. What does the dollar curly brackets ${} mean in JSP? &{} trong JSP có nghĩa là gì?
<c:if>
<fmt:setLocale />
</c:if>
-> Đó là EL expression:
Expression language: Công nghệ JSP 2.0 hỗ trợ expression language. Sử dụng nó để thay thế scriplet <=% %>. Loại bỏ scriplet trong jsp.
JSP EL cho phép truy nhập vào bean sử dụng cú pháp đơn giản ${name}
Ví dụ:
Java:
session.put("tienph", "tien");
JSP:
${tienph!=null ? tienph : 'tung'}
Nếu value của attribute tienph!=null thì hiển thị value của nó, nếu không thì hiển thị text 'tung'
https://docs.oracle.com/javaee/1.4/tutorial/doc/JSPIntro7.html
------------------------------Q&A---------------------------------------------------------
1. Con này không mã hóa password nhỉ?
2. USER_AUTHORITY: 1, 2, 3 có nghĩa là gì nhỉ? 3,2 thì thấy vào xem được nhiều danh mục hơn: 1->General user, 2->KDDI admin, 3->SANKYU admin
3. Khái niệm Schema và User trong Oracle?
4. startsWith
5. Compare Ibatis to Hibernate? RSS feed
6. Đọc lại hibernate
7. Lên lại plan học tập.
8. Blog blog = session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 10);? Cách dùng của nó.
-> Đã xem: Không cần dùng interface mapper mà có thể dùng namespace.id để gọi method được định nghĩa trong xml mapper file
9. Sự khác biệt giữa json.simple và gson là gì? gson có vẻ như có thể parse java obj sang json?
10. Lập kế hoạch nghỉ trước Tết để tăng lương.
11. <result>/jsp/faa001/saa0011.jsp</result> Cái này được config để làm gì.
Bạn đang đọc truyện trên: Truyen247.Pro