• J2EE基础-自定义MVC(下)


    目录

    一、搭建自定义mvc框架环境

    配置依赖

    框架的配置文件添加、以及web.xml的配置-以后开源框架的使用从这一步开始:

    二、通用增删改查

    三、主界面功能


    一、搭建自定义mvc框架环境

    配置依赖

    将框架打成jar包,然后导入新工程,并且把框架的依赖jar包导入进去

    将我们前面的写的代码打成一个jar包然后导入我们的项目

     

    点击后我们在输入jar,选中java下的第一个选项

     输入要放的地址,点击finish即可

    这样的话我们就可以使用我们上次创建的自定义MVC的框架了,然后我们导入其他的依赖(助手类、baseDao……)

      tag:

    1. package com.oyang.tag;
    2. import java.io.IOException;
    3. import java.util.Map;
    4. import java.util.Map.Entry;
    5. import java.util.Set;
    6. import javax.servlet.jsp.JspException;
    7. import javax.servlet.jsp.JspWriter;
    8. import javax.servlet.jsp.tagext.BodyTagSupport;
    9. import com.oyang.util.PageBean;
    10. public class PageTag extends BodyTagSupport{
    11. private PageBean pageBean;
    12. public PageBean getPageBean() {
    13. return pageBean;
    14. }
    15. public void setPageBean(PageBean pageBean) {
    16. this.pageBean = pageBean;
    17. }
    18. @Override
    19. public int doStartTag() throws JspException {
    20. JspWriter out = pageContext.getOut();
    21. try {
    22. out.print(toHTML());
    23. } catch (Exception e) {
    24. // TODO Auto-generated catch block
    25. e.printStackTrace();
    26. }
    27. return super.doStartTag();
    28. }
    29. public String toHTML() {
    30. StringBuffer sb=new StringBuffer();
    31. //隐藏的form表达,作用保存上一次查询条件
    32. sb.append("<form action='"+pageBean.getUrl()+"' id='pageBeanForm' method='post'>");
    33. sb.append(" <input type='hidden' name='page' value=''>");
    34. Map<String, String[]> parameterMap = pageBean.getParameterMap();
    35. if(parameterMap!=null&&parameterMap.size()>0) {
    36. Set<Entry<String, String[]>> entrySet = parameterMap.entrySet();
    37. for (Entry<String, String[]> entry : entrySet) {
    38. String key=entry.getKey();//name/likes/page/rows
    39. String[] values = entry.getValue();
    40. if(!"page".equals(key)) {
    41. for (String value : values) {
    42. sb.append(" <input type='hidden' name='"+key+"' value='"+value+"'>");
    43. }
    44. }
    45. }
    46. }
    47. sb.append("</form>");
    48. //分页条
    49. sb.append("<ul class='pagination justify-content-center'>");
    50. sb.append(" <li class='page-item "+(pageBean.getPage()==1 ? "disabled":"")+"'><a class='page-link'");
    51. sb.append(" href='javascript:gotoPage(1)'>首页</a></li>");
    52. sb.append(" <li class='page-item "+(pageBean.getPage()==1 ? "disabled":"")+"'><a class='page-link'");
    53. sb.append(" href='javascript:gotoPage("+pageBean.previousPage()+")'>&lt;</a></li>");
    54. sb.append(" <li class='page-item'><a class='page-link' href='#'>1</a></li>");
    55. sb.append(" <li class='page-item'><a class='page-link' href='#'>2</a></li>");
    56. sb.append(" <li class='page-item active'><a class='page-link' href='#'>"+pageBean.getPage()+"</a></li>");
    57. sb.append(" <li class='page-item "+(pageBean.getPage()==pageBean.maxPage()? "disabled":"")+"'><a class='page-link' href='javascript:gotoPage("+pageBean.nextPage()+")'>&gt;</a></li>");
    58. sb.append(" <li class='page-item "+(pageBean.getPage()==pageBean.maxPage()? "disabled":"")+"'><a class='page-link' href='javascript:gotoPage("+pageBean.maxPage()+")'>尾页</a></li>");
    59. sb.append(" <li class='page-item go-input'><b>到第</b><input class='page-link'");
    60. sb.append(" type='text' id='skipPage' name='' /><b>页</b></li>");
    61. sb.append(" <li class='page-item go'><a class='page-link'");
    62. sb.append(" href='javascript:skipPage()'>确定</a></li>");
    63. sb.append(" <li class='page-item'><b>共"+pageBean.getTotal()+"条</b></li>");
    64. sb.append("</ul>");
    65. //分页jsp代码
    66. sb.append("<script type='text/javascript'>");
    67. sb.append(" function gotoPage(page) {");
    68. sb.append(" document.getElementById('pageBeanForm').page.value = page;");
    69. sb.append(" document.getElementById('pageBeanForm').submit();");
    70. sb.append(" }");
    71. sb.append(" function skipPage() {");
    72. sb.append(" var page = document.getElementById('skipPage').value;");
    73. sb.append(" if (!page || isNaN(page) || parseInt(page) < 1");
    74. sb.append(" || parseInt(page) > "+pageBean.maxPage()+") {");
    75. sb.append(" alert('请输入1~"+pageBean.maxPage()+"的数字');");
    76. sb.append(" return;");
    77. sb.append(" }");
    78. sb.append(" gotoPage(page);");
    79. sb.append(" }");
    80. sb.append(" </script>");
    81. return sb.toString();
    82. }
    83. }

       BaseDao:

    1. package com.oyang.util;
    2. import java.lang.reflect.Field;
    3. import java.sql.Connection;
    4. import java.sql.PreparedStatement;
    5. import java.sql.ResultSet;
    6. import java.util.ArrayList;
    7. import java.util.List;
    8. import com.oyang.entity.Book;
    9. /**
    10. * T代表的实体类,可以说是Book/User/Goods...
    11. * @author yang
    12. *
    13. * @date 2022年6月21日下午7:11:08
    14. */
    15. public class BaseDao<T> {//不知道查什么,就用泛型替代
    16. /* public List<T> executeQuery(String sql,PageBean PageBean,CallBack<T> CallBack) throws Exception {
    17. *//**
    18. * 1.拿到数据库连接
    19. * 2.拿到域定义对象 PreparedStatement
    20. * 3.执行SQL语句
    21. *//*
    22. Connection con = DBAccess.getConnection();//重复代码1
    23. java.sql.PreparedStatement ps = con.prepareStatement(sql);//重复代码2
    24. ResultSet rs=ps.executeQuery();//重复代码3
    25. while(rs.next()) {
    26. list.add(new Book(rs.getInt("bid"), rs.getString("bname"), rs.getFloat("price")));
    27. }
    28. //查询不同的表,必然要处理不同的结果集,谁调用谁处理
    29. //接口是调用方来实现
    30. return CallBack.foreach(rs);
    31. }*/
    32. //基于调用方组装好的sql语句去做分页:一:对于用户而言,我们要展示第一页第二页第三页的数据,那么对应的limit
    33. public List<T> executeQuery(String sql,PageBean PageBean,CallBack<T> CallBack) throws Exception {
    34. //SELECT * FROM `t_mvc_book` where bname like '%圣墟%'
    35. //从上面得到select count(1) as y from (SELECT * FROM `t_mvc_book` where bname like '%圣墟%') a;
    36. //目的就是为了得到总记录数->得到总页数
    37. //SELECT * FROM `t_mvc_book` where bname like '%圣墟%' limit 10,10;
    38. /**
    39. * 1.拿到数据库连接
    40. * 2.拿到域定义对象 PreparedStatement
    41. * 3.执行SQL语句
    42. */
    43. Connection con = null;//重复代码1
    44. java.sql.PreparedStatement ps = null;//重复代码2
    45. ResultSet rs=null;//重复代码3
    46. if(PageBean!=null&&PageBean.isPagination()) {//分页时
    47. String countSQL=getCountSQL(sql);
    48. con=DBAccess.getConnection();//重复代码1
    49. ps=con.prepareStatement(countSQL);//重复代码2
    50. rs= ps.executeQuery();//重复代码3
    51. if(rs.next()) {
    52. //当前实体类就包含了总记录数
    53. PageBean .setTotal(rs.getString("y"));
    54. }
    55. String pageSQL=getpageSQL(sql,PageBean);
    56. con=DBAccess.getConnection();//重复代码1
    57. ps=con.prepareStatement(pageSQL);//重复代码2
    58. rs= ps.executeQuery();//重复代码3
    59. }else {// 不分页
    60. con=DBAccess.getConnection();//重复代码1
    61. ps=con.prepareStatement(sql);//重复代码2
    62. rs= ps.executeQuery();//重复代码3
    63. }
    64. return CallBack.foreach(rs);
    65. }
    66. /**
    67. * 拼装第N页的数据的SQL
    68. * @param sql
    69. * @return
    70. */
    71. private String getpageSQL(String sql, PageBean pageBean) {
    72. // TODO Auto-generated method stub
    73. return sql+" limit "+pageBean.getStartIndex() + ","+pageBean.getRows();
    74. }
    75. /**
    76. * 拼装符合条件总记录数的sql
    77. * @param sql
    78. * @param pageBean
    79. * @return
    80. */
    81. private String getCountSQL(String sql) {
    82. // TODO Auto-generated method stub
    83. return "select count(1) as y from ("+sql+") t ";
    84. }
    85. public int executeUpdate(String sql, T t,String[] attrs) throws Exception {
    86. Connection con = DBAccess.getConnection();
    87. PreparedStatement ps = con.prepareStatement(sql);
    88. //将T的某一个属性对应的值加到ps对象中
    89. for (int i = 0; i < attrs.length; i++) {
    90. Field f = t.getClass().getDeclaredField(attrs[i]);
    91. f.setAccessible(true);
    92. ps.setObject(i+1, f.get(t));
    93. }
    94. // ps.setObject(i, book.getBname());
    95. // ps.setObject(i, book.getPrice());
    96. return ps.executeUpdate();
    97. }
    98. }

     CallBack<T>:

    1. package com.oyang.util;
    2. import java.sql.ResultSet;
    3. import java.util.List;
    4. /**
    5. * 回调函数接口类的作用?
    6. * 谁调用谁处理
    7. *
    8. * @author yang
    9. *
    10. * @date 2022年6月21日下午8:13:46
    11. */
    12. public interface CallBack<T> {
    13. List<T> foreach(ResultSet rs);
    14. }

    DBAccess :

    1. package com.oyang.util;
    2. import java.io.InputStream;
    3. import java.sql.Connection;
    4. import java.sql.DriverManager;
    5. import java.sql.ResultSet;
    6. import java.sql.SQLException;
    7. import java.sql.Statement;
    8. import java.util.Properties;
    9. /**
    10. * 提供了一组获得或关闭数据库对象的方法
    11. *
    12. */
    13. public class DBAccess {
    14. private static String driver;
    15. private static String url;
    16. private static String user;
    17. private static String password;
    18. static {// 静态块执行一次,加载 驱动一次
    19. try {
    20. InputStream is = DBAccess.class
    21. .getResourceAsStream("config.properties");
    22. Properties properties = new Properties();
    23. properties.load(is);
    24. driver = properties.getProperty("driver");
    25. url = properties.getProperty("url");
    26. user = properties.getProperty("user");
    27. password = properties.getProperty("pwd");
    28. Class.forName(driver);
    29. } catch (Exception e) {
    30. e.printStackTrace();
    31. throw new RuntimeException(e);
    32. }
    33. }
    34. /**
    35. * 获得数据连接对象
    36. *
    37. * @return
    38. */
    39. public static Connection getConnection() {
    40. try {
    41. Connection conn = DriverManager.getConnection(url, user, password);
    42. return conn;
    43. } catch (SQLException e) {
    44. e.printStackTrace();
    45. throw new RuntimeException(e);
    46. }
    47. }
    48. public static void close(ResultSet rs) {
    49. if (null != rs) {
    50. try {
    51. rs.close();
    52. } catch (SQLException e) {
    53. e.printStackTrace();
    54. throw new RuntimeException(e);
    55. }
    56. }
    57. }
    58. public static void close(Statement stmt) {
    59. if (null != stmt) {
    60. try {
    61. stmt.close();
    62. } catch (SQLException e) {
    63. e.printStackTrace();
    64. throw new RuntimeException(e);
    65. }
    66. }
    67. }
    68. public static void close(Connection conn) {
    69. if (null != conn) {
    70. try {
    71. conn.close();
    72. } catch (SQLException e) {
    73. e.printStackTrace();
    74. throw new RuntimeException(e);
    75. }
    76. }
    77. }
    78. public static void close(Connection conn, Statement stmt, ResultSet rs) {
    79. close(rs);
    80. close(stmt);
    81. close(conn);
    82. }
    83. public static boolean isOracle() {
    84. return "oracle.jdbc.driver.OracleDriver".equals(driver);
    85. }
    86. public static boolean isSQLServer() {
    87. return "com.microsoft.sqlserver.jdbc.SQLServerDriver".equals(driver);
    88. }
    89. public static boolean isMysql() {
    90. return "com.mysql.cj.jdbc.Driver".equals(driver);
    91. }
    92. public static void main(String[] args) {
    93. Connection conn = DBAccess.getConnection();
    94. System.out.println(conn);
    95. DBAccess.close(conn);
    96. System.out.println("isOracle:" + isOracle());
    97. System.out.println("isSQLServer:" + isSQLServer());
    98. System.out.println("isMysql:" + isMysql());
    99. System.out.println("数据库连接(关闭)成功");
    100. }
    101. }

    中文乱码处理类: 

    1. package com.oyang.util;
    2. import java.io.IOException;
    3. import java.util.Iterator;
    4. import java.util.Map;
    5. import java.util.Set;
    6. import javax.servlet.Filter;
    7. import javax.servlet.FilterChain;
    8. import javax.servlet.FilterConfig;
    9. import javax.servlet.ServletException;
    10. import javax.servlet.ServletRequest;
    11. import javax.servlet.ServletResponse;
    12. import javax.servlet.annotation.WebFilter;
    13. import javax.servlet.http.HttpServletRequest;
    14. import javax.servlet.http.HttpServletResponse;
    15. /**
    16. * 中文乱码处理
    17. *
    18. */
    19. @WebFilter("*.action")
    20. public class EncodingFiter implements Filter {
    21. private String encoding = "UTF-8";// 默认字符集
    22. public EncodingFiter() {
    23. super();
    24. }
    25. public void destroy() {
    26. }
    27. public void doFilter(ServletRequest request, ServletResponse response,
    28. FilterChain chain) throws IOException, ServletException {
    29. HttpServletRequest req = (HttpServletRequest) request;
    30. HttpServletResponse res = (HttpServletResponse) response;
    31. // 中文处理必须放到 chain.doFilter(request, response)方法前面
    32. res.setContentType("text/html;charset=" + this.encoding);
    33. if (req.getMethod().equalsIgnoreCase("post")) {
    34. req.setCharacterEncoding(this.encoding);
    35. } else {
    36. Map map = req.getParameterMap();// 保存所有参数名=参数值(数组)的Map集合
    37. Set set = map.keySet();// 取出所有参数名
    38. Iterator it = set.iterator();
    39. while (it.hasNext()) {
    40. String name = (String) it.next();
    41. String[] values = (String[]) map.get(name);// 取出参数值[注:参数值为一个数组]
    42. for (int i = 0; i < values.length; i++) {
    43. values[i] = new String(values[i].getBytes("ISO-8859-1"),
    44. this.encoding);
    45. }
    46. }
    47. }
    48. chain.doFilter(request, response);
    49. }
    50. public void init(FilterConfig filterConfig) throws ServletException {
    51. String s = filterConfig.getInitParameter("encoding");// 读取web.xml文件中配置的字符集
    52. if (null != s && !s.trim().equals("")) {
    53. this.encoding = s.trim();
    54. }
    55. }
    56. }

    pageBean实体:

    1. package com.oyang.util;
    2. import java.util.HashMap;
    3. import java.util.Map;
    4. import javax.servlet.http.HttpServletRequest;
    5. /**
    6. * 分页工具类
    7. *
    8. */
    9. public class PageBean {
    10. private int page = 1;// 页码
    11. private int rows = 10;// 页大小
    12. private int total = 0;// 总记录数
    13. private boolean pagination = true;// 是否分页
    14. // 需要新增变量保存上一次查询条件
    15. private Map<String, String[]> parameterMap=new HashMap<String,String[]>();
    16. // 需要新增变量保存上一次请求地址:http://localhost:80/oyang_page/book/search
    17. private String url;
    18. // 需要添加方法:获取最大页的页码
    19. public int maxPage() {
    20. return this.total%this.rows ==0?this.total /this.rows :this.total/this.rows+1;
    21. }
    22. // 需要添加方法:获取上一页的页码
    23. public int previousPage() {
    24. return this.page>1?this.page-1:this.page;
    25. }
    26. // 需要添加方法:获取下一页的页码
    27. public int nextPage() {
    28. return this.page<this.maxPage()?this.page+1:this.page;
    29. }
    30. // 需要新增方法:初始化pagebean
    31. public void setRequest(HttpServletRequest request) {
    32. this.setPage(request.getParameter("page"));
    33. this.setRows(request.getParameter("rows"));
    34. this.setPagination(request.getParameter("pagination"));
    35. this.setUrl(request.getRequestURL().toString());
    36. // System.out.println(request.getRequestURL().toString());
    37. this.setParameterMap(request.getParameterMap());
    38. }
    39. private void setPagination(String pagination) {
    40. if(StringUtils.isNotBlank(pagination)) {
    41. this.setPagination("false".equals(pagination));
    42. }
    43. }
    44. private void setRows(String rows) {
    45. if(StringUtils.isNotBlank(rows)) {
    46. this.setRows(Integer.valueOf(rows));
    47. }
    48. }
    49. public void setPage(String page) {
    50. if(StringUtils.isNotBlank(page)) {
    51. //set自动生成的方法
    52. this.setPage(Integer.valueOf(page));
    53. }
    54. }
    55. public PageBean() {
    56. super();
    57. }
    58. public Map<String, String[]> getParameterMap() {
    59. return parameterMap;
    60. }
    61. public void setParameterMap(Map<String, String[]> parameterMap) {
    62. this.parameterMap = parameterMap;
    63. }
    64. public String getUrl() {
    65. return url;
    66. }
    67. public void setUrl(String url) {
    68. this.url = url;
    69. }
    70. public int getPage() {
    71. return page;
    72. }
    73. public void setPage(int page) {
    74. this.page = page;
    75. }
    76. public int getRows() {
    77. return rows;
    78. }
    79. public void setRows(int rows) {
    80. this.rows = rows;
    81. }
    82. public int getTotal() {
    83. return total;
    84. }
    85. public void setTotal(int total) {
    86. this.total = total;
    87. }
    88. public void setTotal(String total) {
    89. this.total = Integer.parseInt(total);
    90. }
    91. public boolean isPagination() {
    92. return pagination;
    93. }
    94. public void setPagination(boolean pagination) {
    95. this.pagination = pagination;
    96. }
    97. /**
    98. * 获得起始记录的下标
    99. *
    100. * @return
    101. */
    102. public int getStartIndex() {
    103. return (this.page - 1) * this.rows;
    104. }
    105. @Override
    106. public String toString() {
    107. return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination
    108. + ", parameterMap=" + parameterMap + ", url=" + url + "]";
    109. }
    110. }

    StringUtils: 

    1. package com.oyang.util;
    2. public class StringUtils {
    3. // 私有的构造方法,保护此类不能在外部实例化
    4. private StringUtils() {
    5. }
    6. /**
    7. * 如果字符串等于null或去空格后等于"",则返回true,否则返回false
    8. *
    9. * @param s
    10. * @return
    11. */
    12. public static boolean isBlank(String s) {
    13. boolean b = false;
    14. if (null == s || s.trim().equals("")) {
    15. b = true;
    16. }
    17. return b;
    18. }
    19. /**
    20. * 如果字符串不等于null或去空格后不等于"",则返回true,否则返回false
    21. *
    22. * @param s
    23. * @return
    24. */
    25. public static boolean isNotBlank(String s) {
    26. return !isBlank(s);
    27. }
    28. }

    oyang.tad:

    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    5. version="2.0">
    6. <description>JSTL 1.1 core library</description>
    7. <display-name>JSTL core</display-name>
    8. <tlib-version>1.1</tlib-version>
    9. <short-name>y</short-name>
    10. <uri>https://blog.csdn.net/weixin_65211978?type=blog</uri>
    11. <validator>
    12. <description>
    13. Provides core validation features for JSTL tags.
    14. </description>
    15. <validator-class>
    16. org.apache.taglibs.standard.tlv.JstlCoreTLV
    17. </validator-class>
    18. </validator>
    19. <tag>
    20. <name>page</name>
    21. <tag-class>com.oyang.tag.PageTag</tag-class>
    22. <body-content>JSP</body-content>
    23. <attribute>
    24. <name>pageBean</name>
    25. <required>true</required>
    26. <rtexprvalue>true</rtexprvalue>
    27. </attribute>
    28. </tag>
    29. </taglib>

    框架的配置文件添加、以及web.xml的配置-以后开源框架的使用从这一步开始:

    web.xml:

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
    3. <display-name>Oyang_mvc_crud</display-name>
    4. <servlet>
    5. <servlet-name>mvc</servlet-name>
    6. <servlet-class>com.oyang.framework.DispatcherServlet</servlet-class>
    7. <init-param><!-- 可以把值传到 configLocation中-->
    8. <param-name>configLocation</param-name>
    9. <param-value>/oyang.xml</param-value>
    10. </init-param>
    11. </servlet>
    12. <servlet-mapping>
    13. <servlet-name>mvc</servlet-name>
    14. <url-pattern>*.action</url-pattern>
    15. </servlet-mapping>
    16. </web-app>

    二、通用增删改查

     实体类一Book为例:

    1. package com.oyang.entity;
    2. public class Book {
    3. private int bid;
    4. private String bname;
    5. private float price;
    6. public int getBid() {
    7. return bid;
    8. }
    9. public void setBid(int bid) {
    10. this.bid = bid;
    11. }
    12. public String getBname() {
    13. return bname;
    14. }
    15. public void setBname(String bname) {
    16. this.bname = bname;
    17. }
    18. public float getPrice() {
    19. return price;
    20. }
    21. public void setPrice(float price) {
    22. this.price = price;
    23. }
    24. public Book() {
    25. // TODO Auto-generated constructor stub
    26. }
    27. public Book(int bid, String bname, float price) {
    28. super();
    29. this.bid = bid;
    30. this.bname = bname;
    31. this.price = price;
    32. }
    33. @Override
    34. public String toString() {
    35. return "Book [bid=" + bid + ", bname=" + bname + ", price=" + price + "]";
    36. }
    37. }

    Dao方法:

    1. package com.oyang.dao;
    2. import java.sql.Connection;
    3. import java.sql.PreparedStatement;
    4. import java.sql.SQLException;
    5. import java.util.ArrayList;
    6. import java.util.List;
    7. import com.oyang.entity.Book;
    8. import com.oyang.util.BaseDao;
    9. import com.oyang.util.DBAccess;
    10. import com.oyang.util.PageBean;
    11. import com.oyang.util.StringUtils;
    12. public class BookDao extends BaseDao<Book>{
    13. //查询
    14. public List<Book> list(Book book,PageBean pageBean) throws Exception{
    15. String sql=" select * from t_mvc_book where 1=1 ";
    16. String bname=book.getBname();
    17. if(StringUtils.isNotBlank(bname)) {
    18. sql+=" and bname like '%"+bname+"%' ";
    19. }
    20. int bid=book.getBid();
    21. //前台jsp传递到后台,只要传了就有值,没传就是默认值'0'
    22. if(bid!=0) {
    23. sql+=" and bid="+bid;
    24. }
    25. return super.executeQuery(sql, pageBean, rs ->{
    26. List<Book> list=new ArrayList<>();
    27. try {
    28. while(rs.next()) {
    29. list.add(new Book(rs.getInt("bid"), rs.getString("bname"), rs.getFloat("price")));
    30. }
    31. } catch (Exception e) {
    32. // TODO Auto-generated catch block
    33. e.printStackTrace();
    34. }
    35. return list;
    36. });
    37. }
    38. //增
    39. /*public int add(Book book) throws Exception {
    40. Connection con = DBAccess.getConnection();
    41. String sql=" insert into t_mvc_book values(?,?,?)";
    42. PreparedStatement ps = con.prepareStatement(sql);
    43. ps.setObject(1, book.getBid());
    44. ps.setObject(2, book.getBname());
    45. ps.setObject(3, book.getPrice());
    46. return ps.executeUpdate();
    47. }*/
    48. public int add(Book book) throws Exception {
    49. String sql=" insert into t_mvc_book values(?,?,?)";
    50. return super.executeUpdate(sql, book,new String[] {"bid","bname","price"});
    51. }
    52. //删
    53. public int del(Book book) throws Exception {
    54. String sql=" delete from t_mvc_book where bid=?";
    55. return super.executeUpdate(sql, book, new String [] {"bid"});
    56. }
    57. //改
    58. /*public int edit(Book book) throws Exception {
    59. Connection con = DBAccess.getConnection();
    60. String sql=" update t_mvc_book set bname=?,price=? where bid=?";
    61. PreparedStatement ps = con.prepareStatement(sql);
    62. ps.setObject(1, book.getBname());
    63. ps.setObject(2, book.getPrice());
    64. ps.setObject(3, book.getBid());
    65. return ps.executeUpdate();
    66. }*/
    67. public int edit(Book book) throws Exception {
    68. String sql=" update t_mvc_book set bname=?,price=? where bid=?";
    69. return super.executeUpdate(sql, book, new String [] {"bname","price","bid"});
    70. }
    71. }

    BookAction:

    1. package com.oyang.web;
    2. import java.util.List;
    3. import javax.servlet.http.HttpServletRequest;
    4. import javax.servlet.http.HttpServletResponse;
    5. import com.oyang.dao.BookDao;
    6. import com.oyang.entity.Book;
    7. import com.oyang.util.PageBean;
    8. import com.oyang.framework.ActionSupport;
    9. import com.oyang.framework.ModelDriven;
    10. //用到模型驱动接口,作用就是能够帮我快速的封装前台传递过来的参数
    11. public class BookAction extends ActionSupport implements ModelDriven<Book>{
    12. private Book book=new Book();
    13. private BookDao b=new BookDao();
    14. @Override
    15. public Book getModel() {
    16. return book;
    17. }
    18. //增加
    19. public String add(HttpServletRequest request, HttpServletResponse response) throws Exception {
    20. b.add(book);
    21. //toList代表跳到查询界面
    22. return "tolist";
    23. }
    24. //删
    25. public String del(HttpServletRequest request, HttpServletResponse response) {
    26. try {
    27. b.del(book);
    28. } catch (Exception e) {
    29. e.printStackTrace();
    30. }
    31. //toList代表跳到查询界面
    32. return "tolist";
    33. }
    34. //改
    35. public String edit(HttpServletRequest request, HttpServletResponse response) {
    36. try {
    37. b.edit(book);
    38. } catch (Exception e) {
    39. e.printStackTrace();
    40. }
    41. //toList代表跳到查询界面
    42. return "tolist";
    43. }
    44. //查
    45. public String list(HttpServletRequest request, HttpServletResponse response) {
    46. try {
    47. PageBean pageBean = new PageBean();
    48. pageBean.setRequest(request);
    49. List<Book> list=b.list(book, pageBean);
    50. request.setAttribute("list", list);
    51. request.setAttribute("pageBean", pageBean);
    52. } catch (Exception e) {
    53. e.printStackTrace();
    54. }
    55. //执行查询展示
    56. return "list";
    57. }
    58. //跳转到新增/修改界面
    59. public String preEdit(HttpServletRequest request, HttpServletResponse response) {
    60. try {
    61. int bid = book.getBid();
    62. if(bid!=0) {
    63. //传递bid到后台,有且只能查询一条数据,那也就意味着list集合中只有一条
    64. List<Book> list = b.list(book, null);
    65. request.setAttribute("b", list.get(0));
    66. }
    67. } catch (Exception e) {
    68. e.printStackTrace();
    69. }
    70. //toList代表跳到编辑界面
    71. return "toEdit";
    72. }
    73. }

    三、主界面功能

    主界面jsp代码:

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. <%@taglib uri="https://blog.csdn.net/weixin_65211978?type=blog" prefix="y" %>
    4. <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    5. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    6. <html>
    7. <head>
    8. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    9. <link
    10. href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css"
    11. rel="stylesheet">
    12. <script
    13. src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.js"></script>
    14. <title>书籍列表</title>
    15. <style type="text/css">
    16. .page-item input {
    17. padding: 0;
    18. width: 40px;
    19. height: 100%;
    20. text-align: center;
    21. margin: 0 6px;
    22. }
    23. .page-item input, .page-item b {
    24. line-height: 38px;
    25. float: left;
    26. font-weight: 400;
    27. }
    28. .page-item.go-input {
    29. margin: 0 10px;
    30. }
    31. </style>
    32. </head>
    33. <body>
    34. <form class="form-inline"
    35. action="${pageContext.request.contextPath }/book.action?methodName=list" method="post">
    36. <div class="form-group mb-2">
    37. <input type="text" class="form-control-plaintext" name="bname"
    38. placeholder="请输入书籍名称">
    39. </div>
    40. <button type="submit" class="btn btn-primary mb-2">查询</button>
    41. <a href="${pageContext.request.contextPath }/book.action?methodName=preEdit">新增</a>
    42. </form>
    43. <table class="table table-striped ">
    44. <thead>
    45. <tr>
    46. <th scope="col">书籍ID</th>
    47. <th scope="col">书籍名</th>
    48. <th scope="col">价格</th>
    49. <th scope="col">操作</th>
    50. </tr>
    51. </thead>
    52. <tbody>
    53. <c:forEach items="${list}" var="b">
    54. <tr>
    55. <td>${b.bid}</td>
    56. <td>${b.bname}</td>
    57. <td>${b.price}</td>
    58. <td>
    59. <a href="${pageContext.request.contextPath }/book.action?methodName=preEdit$bid=${b.bid}">编辑</a>
    60. <a href="${pageContext.request.contextPath }/book.action?methodName=del$bid=${b.bid}">删除</a>
    61. </td>
    62. </tr>
    63. </c:forEach>
    64. </tbody>
    65. </table>
    66. <y:page pageBean="${pageBean}"></y:page>
    67. </body>
    68. </html>

    效果图:

    查询: 

     

    增加&修改界面:

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    4. <html>
    5. <head>
    6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    7. <title>Insert title here</title>
    8. </head>
    9. <body>
    10. <form action="${pageContext.request.contextPath }/book.action?methodName=${empty b ? 'add' :'edit'}" method="post">
    11. bid:<input type="text" name="bid" value="${b.bid}">
    12. bname:<input type="text" name="bname" value="${b.bname}">
    13. price:<input type="text" name="price" value="${b.price}">
    14. <input type="submit">
    15. </form>
    16. </body>
    17. </html>

     OK,今日的学习就到此结束啦,如果对个位看官有帮助的话可以留下免费的赞哦(收藏或关注也行),如果文章中有什么问题或不足以及需要改正的地方可以私信博主,博主会做出改正的。个位看官,小陽在此跟大家说拜拜啦

  • 相关阅读:
    Taichi 加速 Python 中图像处理
    【译】.NET 7 中的性能改进(二)
    数据分析案例-顾客购物数据可视化分析(文末送书)
    基于ANSYS Polyflow的逆向挤出模头设计攻略
    我封装的一个REPR轮子 Biwen.QuickApi
    竞赛 深度学习疫情社交安全距离检测算法 - python opencv cnn
    Open3D 点云区域生长分割算法
    数据可视化项目基础知识
    基于Java+SpringBoot+Vue的在线音乐网站设计和实现
    经典算法之冒泡排序法与直接选择排序法
  • 原文地址:https://blog.csdn.net/weixin_65211978/article/details/125478903