xml解析及servlet+MySQL的增删改查

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("删除失败!");
		}
		
	}
	
}

今日总结

敲代码还要更加仔细严谨一点,我就老忘记很多东西,也发现了写博客的好处,更方便自己回顾知识点了,距离阿哥又更近了呢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值