经过前天的javaWEB基础的学习,我们对服务器与浏览器的数据通信,以及Servelet的原理以及Jsp页面的组成有了一定的了解了,当然这些知识是非常繁多而凌乱的,完全通过一个一个小例子来演示原理也未免有点枯燥。今天当然是震奋人心的时刻了,因为终于开始学习javaWeb的开发了,今天老师带领我们将以前的知识融合起来,做了一个贴近实际开发的小Demo,同学们都听得津津有味,哈哈,还是总结一下今天的知识点吧。
在java刚开始占web开发的时候就显示了其独特的魅力,那个时候大多都是在jsp+javabean的思想下做开发的。浏览器向服务器jsp页面发出请求,jsp页面调用javabean处理逻辑业务,javabean与数据库联系存取数据,并给jsp页面以回应,最终该jsp响应到浏览器。
随着技术的发展,又出现了以java+servlet+javabean的开发模式,该模式以servlet为中心,适合团队开发,开发速度相对较慢但容易维护。其实这种开发模式已经包含了现在流行的MVC开发模式的思想。
M:model,V:view,C:contronller.view的作用便是解释模型,负责页面的呈现,model负责数据的封装及逻辑处理,contronller负责联系协调view和model,这也是著名的三层架构的思想。
课堂小练习:图书信息管理。
这个练习是通过MVC的模式完成对图书信息的增,添,删,改操作的。
目录图:
用户发来的请求都将其转发到对应的Servlet作处理后再向浏览器响应页面,我在这里只用了main.jsp的完成所有的响应处理,毕竟要接收的响应比较多,完全由jsp页面来处理会显得比较复杂,为了提高用户的体验度,在编辑和删除图书信息的时候采用了jQuery的Ajax模式,在添加图书信息时也增加了一定的动画效果。
添加图书效果:
查看所以图书效果:
编辑图书效果(Ajax):
删除图书效果(Ajax):
源码展示:
继承自图书信息操作接口的实现类:
public class BookServiceXMLImpl implements IBookService {
private static String xmlPath=Config.getPath();
private Document getDoc() {
Document doc = null;
try {
doc = DocumentBuilderFactory
.newInstance()
.newDocumentBuilder()
.parse(xmlPath);
} catch (Exception e) {
throw new ServiceException("未找xml文件");
}
return doc;
}
private void write(Document doc) {
if (doc != null) {
Transformer tf = null;
try {
tf = TransformerFactory.newInstance().newTransformer();
Source source = new DOMSource(doc);
Result result = new StreamResult(
new OutputStreamWriter(
new FileOutputStream(
xmlPath),
"utf-8"));
tf.transform(source, result);
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (TransformerFactoryConfigurationError e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
}
}
@Override
public void save(Book book) {
Document doc = this.getDoc();
if (doc != null) {
Element root = doc.getDocumentElement();
Element eleBook = doc.createElement("book");
eleBook.setAttribute("bookId", book.getBookId());
Element eleBookName = doc.createElement("bookName");
eleBookName.setTextContent(book.getBookName());
Element eleBookPrice = doc.createElement("bookPrice");
eleBookPrice.setTextContent(book.getBookPrice());
Element eleBookPublish = doc.createElement("bookPublish");
eleBookPublish.setTextContent(book.getBookPublish());
eleBook.appendChild(eleBookName);
eleBook.appendChild(eleBookPrice);
eleBook.appendChild(eleBookPublish);
root.appendChild(eleBook);
this.write(doc);
}
}
@Override
public List<Book> getAll() {
List<Book> books = null;
Document doc = this.getDoc();
Book book = null;
if (doc != null) {
Element root = doc.getDocumentElement();
NodeList list = root.getElementsByTagName("book");
books = new ArrayList<Book>();
for (int i = 0; i < list.getLength(); i++) {
Element eleBook = (Element) list.item(i);
book = eleBookToBook(eleBook);
books.add(book);
}
}
return books;
}
private Book eleBookToBook(Element eleBook) {
Book book;
book = new Book();
book.setBookId(eleBook.getAttribute("bookId"));
book.setBookName(eleBook.getElementsByTagName("bookName").item(0)
.getTextContent());
book.setBookPrice(eleBook.getElementsByTagName("bookPrice").item(0)
.getTextContent());
book.setBookPublish(eleBook.getElementsByTagName("bookPublish").item(0)
.getTextContent());
return book;
}
@Override
public Book findById(String bookId) {
Document doc = this.getDoc();
Book book = null;
if (doc != null) {
Element root = doc.getDocumentElement();
NodeList list = root.getElementsByTagName("book");
for (int i = 0; i < list.getLength(); i++) {
Element eleBook = (Element) list.item(i);
if (bookId.equals(eleBook.getAttribute("bookId"))) {
book = eleBookToBook(eleBook);
break;
}
}
}
return book;
}
@Override
public void update(Book book) {
Document doc = this.getDoc();
Element root = doc.getDocumentElement();
if (root != null) {
NodeList list = root.getElementsByTagName("book");
for (int i = 0; i < list.getLength(); i++) {
Element eleBook = (Element)list.item(i);
if(book.getBookId().equals(eleBook.getAttribute("bookId"))){
eleBook.setAttribute("bookId", book.getBookId());
eleBook.getElementsByTagName("bookName").item(0).setTextContent(book.getBookName());
eleBook.getElementsByTagName("bookPrice").item(0).setTextContent(book.getBookPrice());
eleBook.getElementsByTagName("bookPublish").item(0).setTextContent(book.getBookPublish());
break;
}
}
}
this.write(doc);
}
@Override
public void delete(String bookId) {
Document doc = this.getDoc();
Element root = doc.getDocumentElement();
if (root != null) {
NodeList list = root.getElementsByTagName("book");
for (int i = 0; i < list.getLength(); i++) {
Element eleBook = (Element) list.item(i);
if (bookId.equals(eleBook.getAttribute("bookId"))) {
eleBook.getParentNode().removeChild(eleBook);
break;
}
}
}
this.write(doc);
}
}
Js删除图书源码:
$("a.deleteBook").bind("click",function(){
bookId=$(this).attr("bookId");
bookName=$(this).attr("bookName");
var random = Math.round(Math.random()*10);
$('<div></div>').html("<img src='js/gif-images/"+random+".gif' alt='delete this?'/>你真的要删除<font style='color:red;font-weight:bolder;'>"+bookName+"</font>吗?").dialog({
title:"删除提示",
autoOpen: false,
width: 500,
resizable:false,
buttons: {
"确定": function() {
$(this).dialog("close");
$.ajax({
type:"GET",
url:"/deleteBookServlet",
data:"bookId="+bookId,
success:function(){window.location.href="/viewBooksServlet";},
error:function(XMLHttpRequest, textStatus, errorThrown){alert(textStatus);}
});
},
"取消": function() {
$(this).dialog("close");
}
},
modal:true
}).dialog('open');
});