Spring+SpringMVC+JdbcTemplate小Demo

news2024/11/24 11:45:40

项目目录结构

创建mavenWeb项目

pom文件

spring依赖、spring-web依赖、spring-webmvc依赖、spring-test、junit依赖
servlet依赖、jsp依赖、jstl、standard依赖
jackson的core和databind和annotations依赖、fastjson依赖、
文件上传的commons-fileupload和commons-io依赖
日志commons-logging、slf4j-log4j12、log4j依赖
mysql依赖、c3p0依赖、druid依赖、spring-jdbc依赖、spring-tx依赖
lombok依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>SpringDemoModule</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>5.0.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.0.5.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.0.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.10.3</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.10.3</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.10.3</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.74</version>
        </dependency>

        <dependency><!--文件上传-->
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.3</version>
        </dependency>
        <dependency><!--文件上传-->
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>

        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.7</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.8</version>
        </dependency>
        <dependency>
            <groupId>c3p0</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.1.1</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.0.5.RELEASE</version>
        </dependency>
        <dependency><!--tx事务-->
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>5.0.5.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
        </dependency>
    </dependencies>

    <build>
    <plugins>
        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.2</version>
            <configuration>
                <port>8080</port>
                <path>/SpringDemoModule</path>
            </configuration>
        </plugin>
    </plugins>
</build>
</project>

web.xml

配置web容器启动时创建spring上下文对象到servletContext

配置springMvc的post请求的中文乱码的编码过滤器

配置springMvc的前端控制器DispatcherServlet

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!--全局初始化参数-->
    <context-param><!--servletContext.getInitParameter("contextConfigLocation)、jsp中通过el表达式-->
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

    <!--配置Spring的监听器:spring集成web里的
        1.web.xml中配置全局初始化参数contextConfigLocation和org.springframework.web.context.ContextLoaderListener的listener
        当web项目启动加载初始化参数contextConfigLocation,并根据classpath:applicationContext.xml进行new出ApplicationContext对象app,
        将app对象通过setAttribute("app",app)放入当前web应用最大的域servletContext域中域中,并需要时getAttribute取出该app对象。
        2.还有一种方式为定义监听类和@WebListener注解方式详见spring的博客中集成web部分。-->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!--springMvc字符编码过滤器,解决post请求中文乱码问题-->
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!--配置SpringMVC的前端控制器:
    配置一个servlet,类选择第三方org.springframework的DispatcherServlet
    配置该类,且路径为拦截所有来作为springMvc的前端控制器servlet  -->
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param><!--该servlet的初始化参数-->
            <!--spring-mvc.xml是怎么加载的呢
            spring-mvc.xml是怎么加载的呢
            类似web.xml中的<context-param>application域的全局初始化参数。
            这里下面配置初始化参数spring-mvc.xml名称即为web.xml中该DispatcherServlet的servlet的init初始化参数来提供,
            以便org的DispatcherServlet根据这个servlet的init初始化参数去加载springMVC的配置文件,
            继而IOC出controller(特有行为)实例提供给前端控制器DispatcherServlet(共有行为)使用。
            -->
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup><!--loadOnStartup=负整数或不加默认第一次访问该servlet执行时创建servlet对象并初始化
        loadOnStartup为0或正整数时,web服务器启动时创建servlet对象,数字越小,优先级越高-->
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern><!-- 配置该servlet的路径为拦截所有/,虽会覆盖tomcat静态资源访问路径,但现在没有静态资源html之类,只有jsp动态页面。-->
    </servlet-mapping>
</web-app>

resource里log4j.properties

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c:/mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

log4j.rootLogger=info, stdout

resource下jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/jdbc
jdbc.username=root
jdbc.password=root123

resource下applicationContext.xml

配置组件扫描、引入jdbc.properties、配置并接管c3p0数据源、配置并接管jdbcTemplate

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation=
               "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">


    <context:component-scan base-package="com.kdy"/><!--开启组件扫描-->

    <context:property-placeholder location="classpath:jdbc.properties"/><!--引入配置文件,使用el获取-->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driver}"></property>
        <property name="jdbcUrl" value="${jdbc.url}"></property>
        <property name="user" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>
    <!--JdbcTemplate-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
</beans>

com.kdy.converter包中创建DateConverter

public class DateConverter implements Converter<String, Date> {
    @Override
    public Date convert(String dateStr) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        try {
            date = sdf.parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
}

resource下spring-mvc.xml

配置controller的组件扫描、配置并接管视图解析器、配置上并接管日期转换器、配置并接管文件上传解析器、配置注解驱动(可对象转json)并配置日期转换器属性、配静态资源放行。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
    ">
    <!--Controller的组件扫描-->
    <context:component-scan base-package="com.kdy"></context:component-scan>
    <!--配置内部资源视图解析器-->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/jsp/"></property><!--前缀-->
        <property name="suffix" value=".jsp"></property><!--后缀-->
    </bean>
    <!--声明springMvc请求参数为date=2021-02-22时controller入参为Date date的类型转换器
    1.定义这个bean
    2.在springMvc注解驱动中传递这个转换器的bean的id    <mvc:annotation-driven conversion-service="conversionService"/> -->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <list>
                <bean class="com.kdy.converter.DateConverter"></bean>
            </list>
        </property>
    </bean>

    <!--配置文件上传解析器-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!--上传文件的编码类型-->
        <property name="defaultEncoding" value="UTF-8"/>
        <!--上传文件总大小,最大限制,单位byte-->
        <property name="maxUploadSize" value="5242800"/>
        <!--上传单个文件大小,最大限制,单位byte-->
        <property name="maxUploadSizePerFile" value="5242800"/>
    </bean>

    <!--配置处理器映射器-->
<!--    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters">
            <list>
                <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
            </list>
        </property>
    </bean>-->
    <!--注解驱动,顶替配置的上面配置的处理器映射器和适配器,集成了jackson,可Controller资源方法返回字为对象User时,自动转为json-->
    <mvc:annotation-driven conversion-service="conversionService"/>

    <!--js和css和html等被web.xml中配置的前端控制配置拦截了,
          这里配置springMvc静态资源放行-->
    <!--springMvc开放静态资源的访问路径。mapping表示的是映射地址,location表示的是哪个目录下的资源是对外开放的-->
    <mvc:resources mapping="/js/**" location="/js/"/><!--就表示访问路径为/js/**时,在/js/目录下的资源是对外开放的-->
    <mvc:resources mapping="/css/**" location="/css/"/>
    <mvc:resources mapping="/html/**" location="/html/"/>
    <!--上面的<mvc:resources location="/" mapping="/**/*.js"/>等等也可配置为以下代码-->
    <!--    <mvc:default-servlet-handler/>若使用这种方式,必须配置注解驱动,否则controller无法访问-->
    <!-- 意思就是在访问资源时,springMvc帮我们找对于controller的地址,
    如果找不到,就交给原始容器tomcat容器帮我们找静态资源的地址。-->
</beans>

数据表

 com.kdy.domain下

@Data//包括get、set、equals、hashCode、canEqual、toString、无参构造,没有有参构造
@NoArgsConstructor
@AllArgsConstructor
public class Role {
    private Long id;
    private String roleName;
    private String roleDesc;
}
@Data//包括get、set、equals、hashCode、canEqual、toString、无参构造,没有有参构造
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Integer id;
    private String name;
    private String password;
    private String email;
    private Date birthday;
    private Integer infoId;
    private String englishTeacher;
    //当前用户具备的角色
    private List<Role> roles;
}

com.kdy.dao下

public interface RoleDao {
    List<Role> selectAll();
    void save(String roleName,String roleDesc);
    List<Role> selectRolesByUid(Integer uid);
}
public interface UserDao {
    List<User> selectAll();
    Long save(User user);
    void saveUserRoleRelation(Integer uid,Integer [] roleIds);
    void delUserRoleRel(Integer uid);
    void delUser(Integer uid);
}

com.kdy.dao的impl下

@Repository
public class RoleDaoImpl implements RoleDao {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public List<Role> selectAll() {
        return jdbcTemplate.query("select * from sys_role", new BeanPropertyRowMapper<Role>(Role.class));
    }

    public void save(String roleName,String roleDesc) {
        jdbcTemplate.update("insert into sys_role(role_name,role_desc) values(?,?)", roleName, roleDesc);
    }

    @Override
    public List<Role> selectRolesByUid(Integer uid) {
        return jdbcTemplate.query("select * from sys_role where id in(select rid from sys_user_role where uid = ? )", new BeanPropertyRowMapper<Role>(Role.class),uid);
    }
}

注:jdbcTemplate新增操作的主键返回 

@Repository
public class UserDaoImpl implements UserDao {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public List<User> selectAll() {
        return jdbcTemplate.query("select * from sys_user", new BeanPropertyRowMapper<User>(User.class));
    }

    /*
     * 主键返回
     * */
    @Override
    public Long save(User user) {
        //想要新增操作返回主键,不能使用下面这个新增操作的api
        //jdbcTemplate.update("insert into sys_user(name,password,email,birthday,infoId,english_teacher) values(?,?,?,?,?,?)", user.getName(), user.getPassword(), user.getEmail(), user.getBirthday(), user.getInfoId(), user.getEnglishTeacher());、
        String sql = "insert into sys_user(name,password,email,birthday,infoId,english_teacher) values(?,?,?,?,?,?)";
        KeyHolder keyHolder = new GeneratedKeyHolder();
        jdbcTemplate.update(new PreparedStatementCreator() {
            public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
                PreparedStatement ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
                ps.setString(1, user.getName());
                ps.setString(2, user.getPassword());
                ps.setString(3, user.getEmail());
                ps.setDate(4, new java.sql.Date(user.getBirthday().getTime()));
                ps.setInt(5, user.getInfoId());
                ps.setString(6, user.getEnglishTeacher());
                return ps;
            }
        }, keyHolder);
        Long generatedId = keyHolder.getKey().longValue();
        return generatedId;
    }

    @Override
    public void saveUserRoleRelation(Integer uid, Integer[] roleIds) {
        for (Integer rid:roleIds) {
            jdbcTemplate.update("insert into sys_user_role(uid,rid) values(?,?)", uid, rid);
        }
    }

    @Override
    public void delUserRoleRel(Integer uid) {
        jdbcTemplate.update("delete from sys_user_role where uid = ?",uid);
    }

    @Override
    public void delUser(Integer uid) {
        jdbcTemplate.update("delete from sys_user where id = ?",uid);
    }
}

com.kdy.service下

public interface RoleService {
    List<Role> list();
    void save(String roleName,String roleDesc);
}
public interface UserService {
    List<User> list();
    List<Role> selectRolesByUid(Integer uid);
    void save(User user,Integer [] roleIds);
    void deleteUser(Integer userId);
}

com.kdy.service的impl下

@Service
public class RoleServiceImpl implements RoleService {

    @Autowired
    private RoleDao roleDao;

    @Override
    public List<Role> list() {
        return roleDao.selectAll();
    }

    @Override
    public void save(String roleName,String roleDesc) {
        roleDao.save(roleName,roleDesc);
    }

}
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;

    @Autowired
    private RoleDao roleDao;

    @Override
    public List<User> list() {
        return userDao.selectAll();
    }

    @Override
    public List<Role> selectRolesByUid(Integer uid) {
        return roleDao.selectRolesByUid(uid);
    }

    @Override
    public void save(User user,Integer [] roleIds) {
        Long uid = userDao.save(user);//经过主键返回处理了,返回的是新增数据的数据库生成的主键
        userDao.saveUserRoleRelation(uid.intValue(),roleIds);
    }

    @Override
    public void deleteUser(Integer userId) {
        userDao.delUserRoleRel(userId);
        userDao.delUser(userId);
    }

}

com.kdy.controller

@Controller
@RequestMapping("/role")
public class RoleController {

    @Autowired
    private RoleService roleService;

    @RequestMapping("/roleList")
    public ModelAndView list() {
        ModelAndView modelAndView = new ModelAndView();
        List<Role> roleList = roleService.list();
        modelAndView.addObject("roleList",roleList);//放到request域中
        modelAndView.setViewName("role-list");//这里字符串会经过xml中配置的视图解析器处理,拼上前缀后缀,请求转发
        return modelAndView;
    }

    @RequestMapping("/save")
    public String save(HttpServletRequest req,String roleName,String roleDesc) {
        try{
            roleService.save(roleName,roleDesc);
            return "redirect:/role/roleList";
        }catch (Exception e){
            e.printStackTrace();
            req.setAttribute("error_msg","保存失败");
            return "role-add";
        }
    }
}
@Controller
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @Autowired
    private RoleService roleService;

    @RequestMapping("/userList")
    public ModelAndView list() {
        ModelAndView modelAndView = new ModelAndView();
        List<User> userList = userService.list();
        for (User user : userList) {
            List<Role> roles = userService.selectRolesByUid(user.getId());
            user.setRoles(roles);
        }
        modelAndView.addObject("userList", userList);//放到request域中
        modelAndView.setViewName("user-list");//这里字符串会经过xml中配置的视图解析器处理,拼上前缀后缀,请求转发
        return modelAndView;
    }

    @RequestMapping("/saveUI")
    public String saveUI(HttpServletRequest request) {//用这种request加返回String返回页面的方式和上面的ModelAndView的方式均可,不过ModelAndView的方式在jsp页面有代码提示
        List<Role> roleList = roleService.list();
        request.setAttribute("roleList", roleList);
        return "user-add";
    }

    @RequestMapping("/save")
    public String save(User user, Integer[] roleIds, HttpServletRequest req) {//这里使用User对象封装参数,一个个的写入参也行。
        try {
            userService.save(user, roleIds);
            return "redirect:/user/userList";
        } catch (Exception e) {
            e.printStackTrace();
            req.setAttribute("error_msg", "保存失败");
            return "user-add";
        }
    }

    @RequestMapping("/del/{userId}")/*由于客户端使用的restFul风格传参,所以controller接收restful风格参水*/
    public String del(@PathVariable("userId") Integer uid) {
        userService.deleteUser(uid);
        return "redirect:/user/userList";
    }
}

webapp的jsp下

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>index</title>
</head>
<body>
<a href="${pageContext.request.contextPath}/jsp/index.jsp">首页</a><br/>
<a href="${pageContext.request.contextPath}/user/userList">用户管理</a><br/>
<a href="${pageContext.request.contextPath}/role/roleList">角色管理</a><br/>
</body>
</html>

role-list.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!--引入jstl标签库URI-->

<html>
<head>
    <title>RoleList</title>
</head>
<body>
<a href="${pageContext.request.contextPath}/jsp/role-add.jsp">新增</a><br/>
<a href="${pageContext.request.contextPath}/role/roleList">刷新</a><br/>
<table border="1px">
    <thead>
    <tr>
        <td>选中</td>
        <td>id</td>
        <td>角色名</td>
        <td>角色描述</td>
        <td>操作</td>
    </tr>
    </thead>
    <tbody>
    <c:forEach items="${roleList}" var="role">
        <tr>
            <td><input name="ids" type="checkbox"></td>
            <td>${role.id}</td>
            <td>${role.roleName}</td>
            <td>${role.roleDesc}</td>
            <td><a href="#">删除</a></td>
        </tr>
    </c:forEach>
    </tbody>
</table>
</body>
</html>

role-add.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>role-add</title>
</head>
<body>
<p>${error_msg}</p>
<form action="${pageContext.request.contextPath}/role/save" method="post">
    角色名称:<input name="roleName" type="text"><br/>
    角色描述:<input name="roleDesc" type="text"><br/>
    <input type="submit" value="提交"><br/>
    <input type="reset" value="重置"><br/>
</form>
</body>
</html>

user-list.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!--引入jstl标签库URI-->
<html>
<head>
    <title>UserList</title>
    <script>
        function delUser(userId) {
            if(confirm("你要删除吗?")){
                location.href="${pageContext.request.contextPath}/user/del/"+userId;/*这里使用Restful风格传参*/
            }
        }
    </script>
</head>
<body>
<a href="${pageContext.request.contextPath}/user/saveUI">新增</a><br/>
<a href="${pageContext.request.contextPath}/user/userList">刷新</a><br/>
<table border="1px">
    <thead>
    <tr>
        <td>选中</td>
        <td>id</td>
        <td>用户名</td>
        <td>邮箱</td>
        <td>生日</td>
        <td>infoId</td>
        <td>英语老师</td>
        <td>具备角色</td>
    </tr>
    </thead>
    <tbody>
    <c:forEach items="${userList}" var="user">
        <tr>
            <td><input name="ids" type="checkbox"></td>
            <td>${user.id}</td>
            <td>${user.name}</td>
            <td>${user.email}</td>
            <td>${user.birthday}</td>
            <td>${user.infoId}</td>
            <td>${user.englishTeacher}</td>
            <td>
                <c:forEach items="${user.roles}" var="role">
                    &nbsp;&nbsp;${role.roleName}
                </c:forEach>
            </td>
            <td><a href="javascript:void(0);" onclick="delUser(${user.id})">删除</a></td>
            <%--javascript:void(0)让该超链接不跳转到任何地方,而鼠标移上去有小手--%>
            <%--onclick点击时执行的方法--%>
        </tr>
    </c:forEach>
    </tbody>
</table>
</body>
</html>

user-add.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!--引入jstl标签库URI-->
<html>
<head>
    <title>user-add</title>
</head>
<body>
<p>${error_msg}</p>
<form action="${pageContext.request.contextPath}/user/save" method="post">
    角色名称:<input name="name" type="text"><br/>
    密码:<input name="password" type="text"><br/>
    邮箱:<input name="email" type="text"><br/>
    生日:<input name="birthday" type="date"><br/>
    infoId:<input name="infoId" type="text"><br/>
    英语老师:<input name="englishTeacher" type="text"><br/>
    角色:
    <c:forEach items="${roleList}" var="role">
        <input type="checkbox" name="roleIds" value="${role.id}">${role.roleName}
    </c:forEach><br/>
    <input type="submit" value="提交"><br/>
    <input type="reset" value="重置"><br/>
</form>
</body>
</html>

访问目录和页面效果

 http://localhost:8080//SpringDemoModule/jsp/index.jsp

index 

1角色管理 

role-list 

role-add 

2用户管理 

user-list 

user-add 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/766302.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图片修补 EdgeConnect 论文的阅读与翻译:生成边缘轮廓先验,再填补缺失内容

本文将要介绍的论文就是&#xff1a;EdgeConnect: Generative Image Inpainting with Adversarial Edge Learning&#xff0c;因为知乎在&#xff08;2019-02-02&#xff09;前&#xff0c;缺少详细介绍这篇论文的文章&#xff0c;而我最近需要复现它&#xff0c;所以顺便在这里…

消息重试框架 Spring-Retry 和 Guava-Retry

一 重试框架之Spring-Retry 1.Spring-Retry的普通使用方式 2.Spring-Retry的注解使用方式 二 重试框架之Guava-Retry 总结 图片 一 重试框架之Spring-Retry Spring Retry 为 Spring 应用程序提供了声明性重试支持。它用于Spring批处理、Spring集成、Apache Hadoop(等等)。…

智能应急疏散系统在公共建筑中的的应用

安科瑞 华楠 摘 要&#xff1a;随着大型公共建筑物的不断增多&#xff0c;其所产生的各种建筑安全隐患问题也在逐渐加剧&#xff0c;一旦出现火灾险情&#xff0c;要想从公共建筑中安全的脱离出来&#xff0c;其难度也是可想而知。因此&#xff0c;这就需要在进行公共建筑设计时…

Java打怪升级路线的相关知识

第一关:JavaSE阶段 1、计算机基础 2、java入门学习 3、java基础语法 4、流程控制和方法 5、数组 6、面向对象编程 7、异常 8、常用类 9、集合框架 10、IO 11、多线程 12、GUI编程 13、网络编程 14、注解与反射 15、JUC编程 16、JVM探究 17、23种设计模式 18、数据结构与算法 1…

mysql数字开头字符串排序

表结构 CREATE TABLE building (id bigint NOT NULL,name varchar(255) CHARACTER SET utf8mb3 COLLATE utf8_general_ci DEFAULT NULL COMMENT 名称,full_name varchar(255) CHARACTER SET utf8mb3 COLLATE utf8_general_ci DEFAULT NULL COMMENT 全称,PRIMARY KEY (id) USIN…

Qt|读写ini文件使用QSettings 节键值 设置相对路径

#include <QtWidgets/QApplication> #include <QWidget> #include <QSettings> #include <QString>int main(int argc, char *argv[]) {QApplication a(argc, argv);// Qt中使用QSettings类读写ini文件// QSettings构造函数的第一个参数是ini文件的路径…

linux之Ubuntu系列(三)远程管理指令☞Scp

cp scp cp 复制文件 是限制在本地操作 scp&#xff1a; 远程拷贝文件 cp [options] 源文件or 目录 目标文件or 目录 如果复制目录&#xff0c;要加 -r 选项 &#xff0c;同时如果目标目录不存在&#xff0c;会会创建 scp scp就是 secure copy&#xff0c;是一个在linux下用来…

如何创建 Spring Boot 项目

目录 一、Spring Boot 项目的创建 1. 安装 Spring Boot Helper 插件 2. 创建 Spring Boot 项目 3. 项目目录详解 4. 运行 Spring Boot 项目 二、Spring Boot 的优点 前言 Spring Boot 的意思就是 Spring Boot 脚手架的意思&#xff0c;已经总结完成 Spring 的学习&#x…

给httprunnermanager接口自动化测试平台加点功能(七)

文章目录 一、背景1.1、用例列表test_list1.2、套件列表suite_list 二、实现2.1、用例edit页面2.2、套件edit页面 三、数据结构3.1、更新数据结构 四、知识扩展五、总结 一、背景 前面几章优化&#xff0c;从功能bug的优化、到列表的优化、还有字段的优化&#xff0c;暂时满足…

(学习笔记-TCP连接建立)三次握手丢失后分别会发生什么?

第一次握手丢失 当客户端想和服务端建立TCP连接后&#xff0c;首先第一个发的就是SYN报文&#xff0c;然后进入到SYN_SENT状态。 在这之后如果客户端迟迟没有收到服务端的SYN-ACK报文(第二次握手)&#xff0c;就会触发[超时重传]机制&#xff0c;重传SYN报文&#xff0c;而且…

【淘宝API接口开发系列】item_review-获得淘宝商品评论

淘宝/天猫获得淘宝商品评论 API 返回值说明 taobao.item_review 公共参数 请求地址:注册Key和secret接入 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地…

韧性数据安全体系组成:运行保障与底线防御安全 |CEO专栏

「构建适应性进化的韧性数据安全体系」专栏&#xff0c;为你解读美创科技在数据安全的最新探索实践。 上期内容&#xff08;点击此处跳转&#xff09;&#xff0c;专栏重点分享了韧性数据安全体系的重要组成——资产和资产安全。数据资产是网络中最为确定性的存在&#xff0c;以…

qgis以某个字段(属性)的类目值来分类显示不同的颜色和调整每个类别的绘制顺序(一个类别在另一个类别上面不被覆盖)和将某字段(属性)的值当成图层标签进行显示

前言 我这里的样例以北京景区的点shp数据为例,属性表如下所示: 我们将以景区的等级划分成五类,分别显示不同的颜色,并且5A景区绘制在4A景区上方不被遮挡…,并且将景区的名称显示在景区点的上方。 一、分类不同颜色显示 1、自动分配颜色 首先,我们双击图层文件,打开…

小程序源码二开多端合一

1.注册与登录&#xff1a; 用户可以注册账号并登录到小程序&#xff0c;以便进行后续操作和管理。 2.货物管理&#xff1a; 用户可以添加、编辑和删除货物信息。 货物信息包括货物名称、数量、重量、尺寸、装载方式等。 3.拉货服务&#xff1a; 用户可以选择拉货服务&…

TransmittableThreadLocal 原理分析

前言 注&#xff1a;在看此篇文章前&#xff0c;你需要了解 ThreadLocal、InheritableThreadLocal 的原理。 这里先总体的介绍TransmittableThreadLocal &#xff08;下文以 ttl 作为简称&#xff09;的原理再去分析一些核心的源码&#xff0c;旨在先有个整体的认识&#xff0…

(学习笔记-连接断开)TCP四次挥手

TCP四次挥手过程 TCP断开连接是通过四次挥手实现的&#xff0c;双方都可以主动断开连接&#xff0c;断开连接后主机中的资源将被释放&#xff0c;四次挥手的过程如下&#xff1a; 客户端打算关闭连接时&#xff0c;会发送一个TCP首部FIN标志位为1的报文&#xff0c;也就是FIN报…

预警先行,问题零失控,提升物流的重要利器

每一次大促活动&#xff0c;都是商家们的大卖良机&#xff0c;然而出单之后&#xff0c;最怕出现发货异常的问题。比如包裹长时间未揽收、物流长时间未更新...稍有不慎就会影响店铺权重&#xff0c;甚至深陷各种取消订单、退款赔偿的泥潭。 这时物流监控预警就显得格外重要了。…

浏览器书签栏的小图标设置

在我们写项目中肯定需要自定义这些浏览器的图标 , 那么如何设置呢 <link rel"icon" href"favicon.png" type"image/x-icon" /> 其中的href是选择路径 像vue中 , 基本上都是在文件夹public中的index.html设置浏览器标题跟图标 , 图片的大小…

数据库数据恢复-Oracle数据库文件有坏块损坏的数据恢复案例

Oracle数据库故障&检测&#xff1a; 打开oracle数据库报错&#xff1a;“system01.dbf需要更多的恢复来保持一致性&#xff0c;数据库无法打开”。 北亚企安数据恢复工程师检测数据库文件发现sysaux01.dbf有坏块&#xff0c;sysaux01.dbf文件损坏。数据库无备份&#xff0c…

Windows10环境下安装Kibnana

Windows10环境下安装Kibnana 一、Kibana 介绍1. 数据可视化&#xff1a;2. 仪表板&#xff1a;3. 查询和过滤&#xff1a;4. 地理信息系统&#xff08;GIS&#xff09;支持&#xff1a;5. 实时监控和警报&#xff1a; 二、安装步骤1. 官网地址&#xff1a;2. 选择操作系统3. 解…