xml解析及servlet+MySQL的增删改查
目录
一、xml解析
xml资源文件分为.xml文件和*.properties(属性文件),主要用于数据交互和做配置。
1.1 数据交互
以前我们会用xml进行数据交互,但是后面有了json之后xml的数据交互用的越来越少了,原因是比起xml更繁琐的代码,json的形式会更加简洁,数据交互也会相对的便捷。两种表现形式如下:
xml体现形式:xml中的对象以一个对象标签中包含着属性的子标签,数组则是一个标签中包含着多个对象标签,对象标签中也包含着属性标签,就是往里边套。如下:
对象:
<person>
<id>1</id>
<name>zs</name>
<sex>nv</sex>
</person>
数组:
<persons>
<person>
<id>1</id>
<name>zs</name>
<sex>nv</sex>
</person>
<person>
<id>2</id>
<name>ls</name>
<sex>nv</sex>
</person>
</persons>
json表现形式:对象以键值对的方式,最外边是花括号,属性与属性之间以逗号分隔;数组则是中括号中包着json对象,对象与对象之间以逗号分隔;还有一种混合对象,即数组中套了对象或对象中套了数组,如下:
json对象:{id:1,name:'zs',sex:'nv'}
json数组:[{id:1,name:'zs',sex:'nv'},{id:2,name:'ls',sex:'nan'}]
混合对象:[{id:1,name:'zs',sex:'nv',children:{
{id:3,name:'zss',sex:'nv'}
}},{id:2,name:'ls',sex:'nan'}](数组中套了对象)
{id:1,name:'zs',sex:'nv',children:[{id:3,name:'zss',sex:'nv'},{id:3,name:'zss',sex:'nv'}
]}(对象中套数组)
1.2 做配置
xml做配置文件的基本格式如下:
mvc.xml
<config>
<action name="" type="">
<forward result="xx">/xxx.jsp</forward>
</action>
</config>
注:xml与框架密不可分
做配置需要导包:
1.2.1 做配置的三种资源文件位置以及读取方式
1.放在根路径(src路径下),用类名.class.getResourceAsStream("/资源文件名");
2.放在读取资源文件的类的同包下,用类名.class.getResourceAsStream(“资源文件名”);
3.放在WEB-INF或其子目录下,ServletContext application =this.getServletContext();InputStream in=application.getResourceAsStream(“WEB-INF/资源文件名”);
1.2.2 实例(读取根路径下的资源文件)
我们在Demo1.java中读取db.properties文件下的信息,先加载根路径下的资源文件到流中,再用Properties工具类加载流对象并得到了该资源所有的配置信息,最后根据键值输出配置信息:
public class Demo1 {
public static void main(String[] args) throws Exception {
//加载根路径下的资源文件叫db.properties文件,到jvm成为流对象
InputStream in = Demo1.class.getResourceAsStream("/db.properties");
//java.utils.properties
Properties p = new Properties();
//此时p中就加载了流对象,从而就拥有了该资源的所有配置信息
p.load(in);
//输出值
System.out.println(p.getProperty("uname"));
System.out.println(p.getProperty("upass"));
}
}
注:图上db.properties文件是存在于src根路径下,source folder 物理将代码分层。
1.2.3 实例(读取同包下的资源文件)
package com.jiang;
import java.io.InputStream;
import java.util.Properties;
/**
* 读取同包下的资源文件
* @author jiang
*
* date 下午9:19:34
*/
public class Demo2 {
public static void main(String[] args) throws Exception {
InputStream in = Demo1.class.getResourceAsStream("db.properties");
Properties p = new Properties();
//此时p中就加载了流对象,从而就拥有了该资源的所有配置信息
p.load(in);
System.out.println(p.getProperty("uname"));
System.out.println(p.getProperty("upass"));
}
}
效果如下:
注:getResourceAsStream这个方法具有容错性,包容错误不暴露出来,同包下不存在db.properties文件 它也不报错,后面输出值会报空指针。
1.2.4 实例(读取WEB-INF下的资源文件)
package com.jiang;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import javax.servlet.ServletContext;
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="demo",urlPatterns="/demo")
public class Demo3 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext application=this.getServletContext();
InputStream in=application.getResourceAsStream("WEB-INF/db.properties");
Properties p = new Properties();
//此时p中就加载了流对象,从而就拥有了该资源的所有配置信息
p.load(in);
System.out.println(p.getProperty("uname"));
System.out.println(p.getProperty("upass"));
}
}
运行如图:
1.3 xml解析
需要导包:
以及xml文件:
1.3.1 dom4j解析xml文件
dom4j解析xml文件代码,首先获取到需要解析的文件,使用dom4j进行解析,得到资源文件中的students标签,遍历得到每一个student的数据,然后进行比较,确定为需要的数据将其打印输出:
package com.jiang;
import java.io.InputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* dom4j+Xpath解析xml
* @author jiang
*
* date 下午9:45:40
*
* 明确需求:
* 要获取到名字为小芳,id=s002的学生信息,然后在控制台进行打印
*
* 期望结果
* sid=s002,name=小芳
*/
public class Demo4 {
public static void main(String[] args) throws Exception {
//1.获取到待解析的资源文件
//2.利用dom4j进行解析
InputStream in = Demo4.class.getResourceAsStream("/students.xml");
SAXReader reader=new SAXReader();
Document doc = reader.read(in);
List<Element> stuList = doc.selectNodes("/students/student");
for (Element sl : stuList) {
if("s002".equals(sl.attributeValue("sid"))) {
//System.out.println(sl.asXML());
// System.out.println("----------------------");
Element name=(Element)sl.selectSingleNode("name");
System.out.println("sid="+sl.attributeValue("sid")+",name="+name.getText());
}
}
}
}
效果图:
1.3.1 dom4j+Xpath解析xml文件
增加了Xpath来解析xml文件,就不用一个一个去比较是否是需要的文件,直接一步到位校验出需要的数据,代码更为简洁,如下:
package com.jiang;
import java.io.InputStream;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Demo5 {
public static void main(String[] args) throws Exception {
InputStream in = Demo4.class.getResourceAsStream("/students.xml");
SAXReader reader=new SAXReader();
Document doc = reader.read(in);
Element stuEle002=(Element)doc.selectSingleNode("/students/student[@sid='s002']");
Element nameEle=(Element)stuEle002.selectSingleNode("name");
System.out.println("sid="+stuEle002.attributeValue("sid")+",name="+nameEle.getText());
}
}
效果图:
二、servlet+MySQL的增删改查
我是在上一篇的通用分页的基础上写的,需要的包啥的在上一篇博客讲过啦 ~ 这边就分析代码啦 ~
2.1 注意事项
都是江自己不(tai)小(cu)心(xin)遇到的问题。
1.仔细分析数据库表,想清楚对应的数据类型,因为本次使用了一张编号虽然全是数字但是很长的表,江第一眼就把编号在实体类中写成int类型,然后超出长度限制报错啦~
2.因为江连的数据库MySQL中的云数据库,云数据库一定要记得联网!不然项目会报错~
3.MySQL中的SQL语句中需要写字段,最好这样书写:·字段名·(tab上边那个键打的点),因为有时候字段名与关键字冲突会报这个错:check the manual that corresponds to your MySQL server version for the right syntax。
2.2 效果图
不是特别美观,江只做了功能,查询所有,分页,模糊查询,查看详情(删除,修改),增加。
主界面:
详情界面:
增加后新增的数据(后三条):
2.3 项目流程
1.如果没有数据则主界面跳转RecruitmentServlet获取到数据再返回到主界面;
2.查询框可根据公司模糊查询,同是跳转到RecruitmentServlet中获取数据;
package com.jiang.action;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.jiang.dao.RecruitmentDao;
import com.jiang.entity.Recruitment;
import com.jiang.util.PageBean;
public class RecruitmentServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Recruitment s=new Recruitment();
RecruitmentDao rd=new RecruitmentDao();
req.setCharacterEncoding("utf-8");
String name=req.getParameter("name");
if(name==null) {
name="";
}
HttpSession session = req.getSession();
PageBean pageBean=new PageBean();
pageBean.setRequest(req);
req.setAttribute("pageBean", pageBean);
List<Recruitment> ls=rd.find(name,pageBean);
if(ls.size()!=0) {
req.setAttribute("recruitment", ls);
session.setAttribute("name", name);
req.getRequestDispatcher("index.jsp").forward(req, resp);
}
}
}
3.增加是点击链接跳转增加界面,把所有值通过form表单传到AddServlet中,通过dao方法增加数据;
4.查看详情就是把编号传递到detailsServlet中,通过dao方法查询到需要的这条数据;
5.删除是将编号传递到delServlet中,通过dao方法连接数据库删除数据:
6.修改是先传递一个编号到OneServlet中查询到这条需要修改的数据,再跳转到edit.jsp中进行数据修改,然后将数据提交到EditServlet中,通过dao方法连接数据库修改数据:
package com.jiang.action;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.jiang.dao.RecruitmentDao;
import com.jiang.entity.Recruitment;
import com.jiang.util.PageBean;
public class EditServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Recruitment s=new Recruitment();
RecruitmentDao rd=new RecruitmentDao();
req.setCharacterEncoding("utf-8");
String id=req.getParameter("id");
String job=req.getParameter("job");
String company=req.getParameter("company");
String address=req.getParameter("address");
String salary=req.getParameter("salary");
if(salary==null) {
salary="";
}
String url=req.getParameter("url");
if(url==null) {
url="";
}
String limit=req.getParameter("limit");
if(limit==null) {
limit="";
}
String time=req.getParameter("time");
if(time==null) {
time="";
}
String desc=req.getParameter("desc");
if(desc==null) {
desc="";
}
String jobHandle=req.getParameter("jobHandle");
if(jobHandle==null) {
jobHandle="";
}
String addressHandle=req.getParameter("addressHandle");
if(addressHandle==null) {
addressHandle="";
}
HttpSession session = req.getSession();
s.setId(id);
s.setJob(job);
s.setCompany(company);
s.setAddress(address);
s.setSalary(salary);
s.setUrl(url);
s.setLimit(limit);
s.setTime(time);
s.setDesc(desc);
s.setJobHandle(jobHandle);
s.setAddressHandle(addressHandle);
System.out.println(s);
int n= rd.Edit(s);
if(n>0) {
req.getRequestDispatcher("recruitment.action").forward(req, resp);
}else {
System.out.println("删除失败!");
}
}
}
今日总结
敲代码还要更加仔细严谨一点,我就老忘记很多东西,也发现了写博客的好处,更方便自己回顾知识点了,距离阿哥又更近了呢!