前言
前面已经了解了通用分页到自定义MVC的演变过程 其中包含了很多东西 这里就不再描述了
感兴趣的可以自己去看下
通用分页上:点我
通用分页上:点我
自定义MVC:点我
通用分页进阶版:点我
那么今天我们来练习用写好的MVC框架来实现 招聘信息的一个案例
准备阶段
还是老样子导入我们所需需要的包 到lib下面
还有我们的辅助类
pageTag就不用多说了吧 用于拼接页面的JSP代码从而实现页面的简化
流程
把我们前面写好了的中央控制器 还有自控制器C过来
前面已经写好了分页的方法 还有dao方法的简便话 我们只需要用就行了
我们要写的是招聘信息的案列
所以需要一个实体类 Recruiment 封装好 写上一个无参的构造方法 还有toString方法 有参的构造方放
package com.zhuchenxi.entity;
import java.io.Serializable;
import java.util.Date;
/**
* 招聘信息的实体类
* @author 小曦
*
* http://www.javaxl.com
*/
public class Recruitment{
private String id;
private String job;
private String company;
private String address;
private String salary;
private String url;
private String limitd;
private Date time;
private String desc;
private String jobHandle;
private String addressHandle;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getSalary() {
return salary;
}
public void setSalary(String salary) {
this.salary = salary;
}
public String getLimitd() {
return limitd;
}
public void setLimit(String limitd) {
this.limitd = limitd;
}
public Date getTime() {
return time;
}
public void setTime(Date time) {
this.time = time;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public String getJobHandle() {
return jobHandle;
}
public void setJobHandle(String jobHandle) {
this.jobHandle = jobHandle;
}
public String getAddressHandle() {
return addressHandle;
}
public void setAddressHandle(String addressHandle) {
this.addressHandle = addressHandle;
}
@Override
public String toString() {
return "Recruitment [id=" + id + ", job=" + job + ", company=" + company + ", address=" + address + ", salary="
+ salary + ", url=" + url + ", limitd=" + limitd + ", time=" + time + ", desc=" + desc + ", jobHandle="
+ jobHandle + ", addressHandle=" + addressHandle + "]";
}
public Recruitment(String id, String job, String company, String address, String salary, String url, String limitd,
Date time, String desc, String jobHandle, String addressHandle) {
this.id = id;
this.job = job;
this.company = company;
this.address = address;
this.salary = salary;
this.url = url;
this.limitd = limitd;
this.time = time;
this.desc = desc;
this.jobHandle = jobHandle;
this.addressHandle = addressHandle;
}
public Recruitment() {}
}
接下来开始写我们的dao方法 RtDao
写RtDao的时候要继承我们之前写好的类BaseDao
在BaseDao里面有我们写好的便捷方法executeQuery list带一个泛型K 这样我们想传什么实体类都可以了 方法里卖带参数sql 还有我们准备反射实力化对象的参数clz 以及我们分页的参数 pagebean
public List<K> executeQuery(String sql, Class clz,PageBean pagebean) throws Exception{
List<K> ls=new ArrayList<K>();
Connection con = DBAccess.getConnection();
PreparedStatement ps = con.prepareStatement(sql);
ResultSet rs=null;
if(pagebean!=null && pagebean.isPagination()) {
//想分页
String countSql=getCountSql(sql);
ps = con.prepareStatement(countSql);
rs=ps.executeQuery();
if(rs.next()) {
pagebean.setTotal(rs.getObject(1).toString());
}
//展示想要看到的数据 比如说第三条的数据
String pageSql=getPageSql(sql,pagebean);
ps = con.prepareStatement(pageSql);
rs=ps.executeQuery();
}else {
//不想分页
ps = con.prepareStatement(sql);
rs=ps.executeQuery();
}
while(rs.next()) {
//ls.add(new Book(rs.getInt("bid"), rs.getString("bname"), rs.getString("price")));
K k=(K)clz.newInstance();
//Field[] fields = clz.getDeclaredFields();
for (Field f : clz.getDeclaredFields()) {
f.setAccessible(true);
f.set(k, rs.getObject(f.getName()));
}
ls.add(k);
}
DBAccess.close(con, ps, rs);
return ls;
}
Rtdao方法里面包括了 查询所有模糊查询
list带的两个参数 是实体类招聘信息 还有分页
返回的时候调用返回return super.executeQuery(sql, r.getClass(), pageBean);
public List<Recruitment> list(Recruitment r,PageBean pageBean) throws Exception{
String name=r.getCompany();
String id=r.getId();
String sql="select * from t_solr_job where true ";
if(name!=null) {
sql+=" and company like '%"+name+"%'";
}
if(id!=null) {
sql+=" and id='"+id+"'";
}
return super.executeQuery(sql, r.getClass(), pageBean);
}
增加
public int add(Recruitment r) throws Exception{
String sql="insert into t_solr_job values(?,?,?,?,?,?,?,now(),?,?,?)";
return super.executeUpdate(sql, r,new String[] {"id","job","company","address","salary","url","limitd","desc","jobHandle","addressHandle"} );
}
删除
public int del(Recruitment r) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, SQLException {
String sql="delete from t_solr_job where id=?";
return super.executeUpdate(sql, r, new String[] {"id"});
}
修改
public int edit(Recruitment r) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, SQLException{
String sql="update t_solr_job set `job`=?,`company`=?,`address`=?,`salary`=?,`url`=?,`limitd`=?,`desc`=?,`jobHandle`=?,`addressHandle`=? where `id`=?";
return super.executeUpdate(sql, r,new String[] {"job","company","address","salary","url","limitd","desc","jobHandle","addressHandle","id"} );
}
完了之后我们需要再写一个RecruitmenServlet配置在我们的MVC.xml文件里面进行截取
package com.zhuchenxi.action;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
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.zhuchenxi.dao.RtDao;
import com.zhuchenxi.entity.Recruitment;
import com.zhuchenxi.framework.ActionSupport;
import com.zhuchenxi.framework.ModelDriven;
import com.zhuchenxi.util.PageBean;
public class RecruitmentServlet extends ActionSupport implements ModelDriven<Recruitment>{
private static final long serialVersionUID = 1L;
private Recruitment r=new Recruitment();
public RtDao rd=new RtDao();
public String list(HttpServletRequest req, HttpServletResponse resp) throws Exception {
Recruitment re=new Recruitment();
req.setCharacterEncoding("utf-8");
String name=req.getParameter("name");
re.setCompany(name);
PageBean pageBean=new PageBean();
pageBean.setRequest(req);
req.setAttribute("pageBean", pageBean);
try {
List<Recruitment> ls= rd.list(re, pageBean);
req.setAttribute("recruitment", ls);
req.setAttribute("name", name);
req.getRequestDispatcher("/index.jsp").forward(req, resp);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "list";
}
public String add(HttpServletRequest req, HttpServletResponse resp) throws Exception {
rd.add(r);
return "toList";
}
public String del(HttpServletRequest req, HttpServletResponse resp) throws Exception {
rd.del(r);
return "toList";
}
public String edit(HttpServletRequest req, HttpServletResponse resp) throws Exception {
rd.edit(r);
return "toList";
}
public String toEdit(HttpServletRequest req, HttpServletResponse resp) throws Exception {
Recruitment re=this.rd.list(r, null).get(0);
req.setAttribute("r", re);
return "toEdit";
}
public String one(HttpServletRequest req, HttpServletResponse resp) throws Exception {
Recruitment re=this.rd.list(r, null).get(0);
req.setAttribute("Recruitment", re);
return "toOne";
}
@Override
public Recruitment getModel() {
// TODO Auto-generated method stub
return r;
}
接下是配置的路径
<?xml version="1.0" encoding="UTF-8"?>
<config>
<action path="/recruitment" type="com.zhuchenxi.action.RecruitmentServlet">
<forward name="list" path="/index.jsp" redirect="false" />
<forward name="toOne" path="details.jsp" redirect="" />
<forward name="toEdit" path="Edit.jsp" redirect="false" />
<forward name="toList" path="/recruitment.action?methodName=list" redirect="" />
</action>
</config>
接下来就写我们的页面了
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="z" uri="/zhuchenxi" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css" rel="stylesheet">
<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.js"></script>
<title>Insert title here</title>
<style type="text/css">
.page-item input {
padding: 0;
width: 40px;
height: 100%;
text-align: center;
margin: 0 6px;
}
.page-item input,
.page-item b {
line-height: 38px;
float: left;
font-weight: 400;
}
.page-item.go-input {
margin: 0 10px;
}
</style>
</head>
<body>
<form class="form-inline" action="${pageContext.request.contextPath }/recruitment.action?methodName=list" method="post">
<div class="form-group mb-2">
<input type="text" class="form-control-plaintext" name="name" value="${name }" placeholder="请输入公司名称">
</div>
<button type="submit" class="btn btn-primary mb-2">查询</button>
<a href="add.jsp" class="btn btn-primary mb-2 ml-4">增加</a>
</form>
<table class="table table-striped">
<tr>
<td scope="col">职位</td>
<td scope="col">公司</td>
<td scope="col">工作地址</td>
<td scope="col">薪资</td>
<td scope="col">学历要求</td>
<td scope="col">爬取时间</td>
<td scope="col">查看详情</td>
</tr>
<c:forEach items="${recruitment}" var="r" >
<tr>
<td>${r.job}</td>
<td>${r.company }</td>
<td>${r.address }</td>
<td>${r.salary }</td>
<td>${r.limitd }</td>
<td>${r.time }</td>
<td>
<a href="${pageContext.request.contextPath }/recruitment.action?methodName=del&id=${r.id}" class="btn btn-danger mb-2 ml-4" >删除</a>
<a href="${pageContext.request.contextPath }/recruitment.action?methodName=toEdit&id=${r.id}" class="btn btn-danger mb-2 ml-4" >修改</a>
</td>
</tr>
</c:forEach>
</table>
<z:page pageBean="${pageBean }"></z:page>
</body>
</html>
增加页面的 样式就不弄了
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="recruitment.action?methodName=add" method="post">
编号:<input name="id" /><br />
职位:<input name="job" /><br />
公司:<input name="company" /><br />
工作地址:<input name="address" /><br />
薪资:<input name="salary" /><br />
路径:<input name="url" /><br />
要求:<input name="limit" /><br />
desc:<input name="desc" /><br />
jobHandle:<input name="desc" /><br />
addressHandle:<input name="desc" /><br />
<input type="submit" value="增加" />
</form>
</body>
</html>```
修改的
<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>
职位:
公司:
工作地址:
薪资:
路径:
要求:
desc:
jobHandle:
addressHandle:
```
然后跑起来
效果展示
查询 这个是根据公司名称来查询的 别查其他的= =
增加 跳转到增加界面 增加完毕后跳转回主界面
增加成功
删除 删除成功
修改 把追一科技修改成 哈拉少
成功
结尾
MVC模式的分页虽然内容多 有些地方确实不懂 但是多用两次就真的觉得老方便了