包结构
环境搭建 参考《spring实战》
maven环境项目搭建主要演示搭建springmvc环境,配置数据源,应用JdbcTemplate.,jsp
pom.xml
<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>spring</groupId>
<artifactId>1_springjavaconfig_jdbcTempalte</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>j1_springjavaconfig_jdbcTempalte</name>
<url>http://maven.apache.org</url>
<properties>
<!-- Generic properties -->
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- Web -->
<jsp.version>2.2</jsp.version>
<jstl.version>1.2</jstl.version>
<servlet.version>3.1.0</servlet.version>
<!-- Spring -->
<spring-framework.version>4.3.7.RELEASE</spring-framework.version>
<!-- Logging -->
<logback.version>1.0.13</logback.version>
<slf4j.version>1.7.5</slf4j.version>
</properties>
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
<!-- Spring MVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring-framework.version}</version>
</dependency>
<!-- 其他web依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${servlet.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>${jsp.version}</version>
<scope>provided</scope>
</dependency>
<!-- Spring and Transactions -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring-framework.version}</version>
</dependency>
<!-- 使用SLF4J和LogBack作为日志 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>${logback.version}</version>
</dependency>
<!--对json和xml格式的支持 -->
<!-- <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId>
<version>2.5.3</version> </dependency> -->
<!--配置springmvc信息转化为json所需的json包 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.6</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.6</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.8.6</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.6</version>
</dependency>
<!-- file upload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<!-- 非必需,可简化IO操作 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.3</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring-framework.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring-framework.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.6</version>
</dependency>
<!--aspectj依赖 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>1.8.9</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.7.4</version>
</dependency>
<!--mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.2.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
</project>
1.webInitializer.java
package com.niugang;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
/**
* 相当于web.xml
* AbstractAnnotationConfigDispatcherServletInitializer 源码里面有解释
* 这个是注解形式注册
* DispatcherServlet容器
* @author niugang
*
*/
public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
/**
* 源码里面与对此方法的解释 配置applicationContext
*/
@Override
protected Class<?>[] getRootConfigClasses() {//指定上下文配置类
return new Class<?>[]{RootConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {//指定sprinfgmvc配置类
return new Class<?>[]{SpringMVCconfig.class} ;
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"}; //将DispatcherServlet请求映射的/上
}
}
2.SpringMvcConfig.java
package com.niugang;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
/**
*
* @author niugang springmvc java配置文件
*/
/*
*
* 测试样列
* @RunWith(SpringJUnit4ClassRunner.class)
* @ContextConfiguration(classes={AppConfig.class, DatabaseConfig.class})
* public class MyTests {
*
* @Autowired MyBean myBean;
*
* @Autowired DataSource dataSource;
*
* @Test
* public void test() {
* }
* }
*
*/
@Configuration // 说明此类为配置文件类,源码里面有样例
@EnableWebMvc // 开启springmvc
@ComponentScan("com.niugang") // 组件扫描
public class SpringMVCconfig extends WebMvcConfigurerAdapter {
/**
* 配置JSP视图解析器
* @return
*/
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
resolver.setExposeContextBeansAsAttributes(true);
return resolver;
}
/**
* 配置静态资源的处理
* 对静态资源的请求转发到容器缺省的servlet,而不使用DispatcherServlet
*/
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
3.RootConfig.java
package com.niugang;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.Import;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
/**
* 上下文配置
* @author niugang
*
*/
@Configuration
@ComponentScan(basePackages={"con.niugang"},
excludeFilters={
@Filter(type=FilterType.ANNOTATION, value=EnableWebMvc.class)
}
)
//在上下文中引入jdbc配置文件
@Import({JdbcConfig.class})
public class RootConfig {
}
4.jdbcConfig.java
package com.niugang;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
/**
* jdbc配置文件
* @author niugang
*
*/
@Configuration
/*
*
* @PropertySource注解如何使用,源码里面有例子
* 即从配置文件中如何获取获取值,源码里面也有解释
*
*/
@PropertySource("classpath:jdbc.properties")
public class JdbcConfig {
@Autowired
private Environment env;
/**
* 配置数据源
* @return
*/
@Bean
public DataSource dataSource(){
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setUrl(env.getProperty("url"));
dataSource.setDriverClassName(env.getProperty("driverName"));
dataSource.setUsername(env.getProperty("datausername"));
dataSource.setPassword(env.getProperty("password"));
return dataSource;
}
/**
* 配置jdbcTemplate
* @param dataSource
* @return
*/
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource){
return new JdbcTemplate(dataSource);
}
}
5.Resource//放置配置文件的文件夹
jdbc.properties
url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf-8
driverName=com.mysql.jdbc.Driver
#key名为username,在spring 默认的DriverManagerDataSource数据源配置中获取有问题建议换做其他名字
datausername=root
password=123456
log4j.properties
# LOG4J配置
log4j.rootCategory=INFO, stdout, file, errorfile
log4j.category.com.niugang=debug, didifile
log4j.logger.error=errorfile
# 控制台输出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n
# root日志输出
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.file=d:/javaconfiglog/logs/all.log
log4j.appender.file.DatePattern='.'yyyy-MM-dd
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n
# error日志输出
log4j.appender.errorfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.errorfile.file=d:/javaconfiglog/logs/error.log
log4j.appender.errorfile.DatePattern='.'yyyy-MM-dd
log4j.appender.errorfile.Threshold = ERROR
log4j.appender.errorfile.layout=org.apache.log4j.PatternLayout
log4j.appender.errorfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n
# com.niugang下的日志输出
log4j.appender.didifile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.didifile.file=d:/javaconfiglog/logs/my.log
log4j.appender.didifile.DatePattern='.'yyyy-MM-dd
log4j.appender.didifile.layout=org.apache.log4j.PatternLayout
log4j.appender.didifile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L ---- %m%n
5.entity包
User.java
package com.niugang.entity;
public class User {
private int id;
private String name;
private Integer age;
private String phone;
private String password;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
UserMapper.java//数据库查询映射类
package com.niugang.entity;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.RowMapper;
public class UserMapper implements RowMapper<User>{
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setAge(rs.getInt("age"));
user.setPhone(rs.getString("phone"));
user.setPassword(rs.getString("password"));
return user;
}
}
6.service包
UserService.java
package com.niugang.service;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.niugang.dao.UserDao;
import com.niugang.entity.User;
@Service
public class UserService {
@Resource
private UserDao userDao;
public List<User> queryList() {
return userDao.queryList();
}
public void save(User user) {
userDao.save(user);
}
public User get(int id) {
return userDao.get(id);
}
public void delete(int id) {
userDao.delete(id);
}
}
7.dao包
UserDao.java
package com.niugang.dao;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import com.niugang.entity.User;
import com.niugang.entity.UserMapper;
@Repository
public class UserDao {
@Resource
private JdbcTemplate jdbcTemplate;
public List<User> queryList() {
return jdbcTemplate.query("select * from user", new UserMapper());
}
public void save(User user) {
jdbcTemplate.update("insert into user (name,password,age,phone) values(?,?,?,?)",
new Object[] { user.getName(), user.getPassword(), user.getAge(), user.getPhone() });
}
public User get(int id) {
List<User> list = jdbcTemplate.query("select * from user where id=?", new Object[] { id }, new UserMapper());
if (list != null && list.size() > 0) {
return list.get(0);
}
return null;
}
public void delete(int id) {
jdbcTemplate.execute("delete from user where id =" + id);
}
}
8.controller包
package com.niugang.controller;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.niugang.entity.User;
//import com.niugang.service.IndexService;
import com.niugang.service.UserService;
@Controller
public class IndexController {
@Autowired
@Qualifier("indexService")
//private IndexService indexService;
@Resource
private UserService userService;
/**
* 默认访问的路径
*
* @return
*/
@RequestMapping(value = "/", method = RequestMethod.GET)
public String toindex() {
return "redirect:index";
}
@RequestMapping(value = "index", method = RequestMethod.GET)
public String index(ModelMap map) {
//map.put("msg", indexService.printMsg());
return "index";
}
@RequestMapping(value = "error")
public void error() {
throw new RuntimeException("哎呀出错了");
}
@RequestMapping(value = "/list")
public String list(ModelMap map) {
List<User> list = userService.queryList();
map.put("list", list);
return "list";
}
@RequestMapping(value = "/detail/{id}")
public String detail(@PathVariable(value = "id") Integer id, ModelMap map) {
User user = userService.get(id);
map.put("user", user);
return "detail";
}
@RequestMapping(value = "toAdd")
public String toAdd() {
return "add";
}
@RequestMapping(value = "/save")
public String save(User user, ModelMap map) {
user.setPassword("123456");
userService.save(user);
return "redirect:/index";
}
}
9.aop包
package com.niugang.aop;
import javax.servlet.http.HttpServletRequest;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
/**
*
* @author niugang
*
*/
@Aspect
@Component
@EnableAspectJAutoProxy // 启用aop
public class WebLogAscept {
private Logger logger = LoggerFactory.getLogger(WebLogAscept.class);
/**
* 方式一 @Pointcut("execution(public * com.niugang.controller..*.*(..))")
* public void WebLogAscept() { }
*
* @Around(value = "WebLogAscept()") public Object
* aroundAdvice(ProceedingJoinPoint pjd) throws Throwable {
* logger.info("请求前"); Object proceed = pjd.proceed();
* logger.info("请求后");
*
* return proceed; //必须得有返回值,否则不能往下执行 }
**/
/**
* 方式二 在增强上配置匿名切点
*
* @param pjd
* @return
* @throws Throwable
*/
@Around("execution(public * com.niugang.controller..*.*(..))")
public Object aroundAdvice(ProceedingJoinPoint pjd) throws Throwable {
logger.info("请求前");
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes r = (ServletRequestAttributes) requestAttributes;
HttpServletRequest request = r.getRequest();
logger.info("url is {}", request.getRequestURL());
logger.info("request params is {}", request.getParameterMap() == null ? "" : request.getParameterMap());
Object proceed = pjd.proceed();
logger.info("请求后");
return proceed; // 必须得有返回值,否则不能往下执行
}
}
WebLogAscept.java 用于web层日志记录
ExceptionControllerAscept.java 用于异常处理
package com.niugang.aop;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
/**
* controller层统一异常处理
*
* @author niugang
*
*/
@Aspect
@Component
@EnableAspectJAutoProxy
public class ExceptionControllerAscept {
private Logger logger = LoggerFactory.getLogger(ExceptionControllerAscept.class);
/**
* 匿名切点的方式
* @param ex
* @throws ServletException
* @throws IOException
*/
@AfterThrowing(value = "execution(public * com.niugang.controller..*.*(..))", throwing = "ex")
public void aroundAdvice(Exception ex) throws ServletException, IOException {
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes r = (ServletRequestAttributes) requestAttributes;
HttpServletRequest request = r.getRequest();
HttpServletResponse response = r.getResponse();
//第一如果是 RuntimeException
if (ex instanceof RuntimeException) {
logger.error("抛出运行时异常{}", ex.getMessage());
request.setAttribute("errorMsg", ex.getMessage());
//跳转到错误页面
request.getRequestDispatcher("/WEB-INF/views/error.jsp").forward(request, response);
}
}
}
10.mian/webapp/WEB-INF/views页面
index.jsp
<%@ 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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
纯java配置方式构建spring框架<br>
<hr>
纯java配置访问jdbc
<a href="list">数据列表</a>
<hr>
纯java配置访问aop处理异常
<a href="error">异常</a>
</body>
</html>
list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!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>数据展示</title>
<style type="text/css">
table {
border-collapse: collapse;
margin: 0 auto;
}
table, td, th {
border: 1px solid black;
padding: 15px;
}
</style>
</head>
<body>
<a href="toAdd" >添加</a>
<table>
<thead>
<tr>
<th>用户名</th>
<th>年龄</th>
<th>电话</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<c:forEach items="${list}" var="user">
<tr>
<td>${user.name}</td>
<td>${user.age}</td>
<td>${user.phone}</td>
<td><a href="javascript:void(0)" onclick="edit('${user.id}')">编辑</a>
<a href="javascript:void(0)" onclick="del('${user.id}')">删除</a> <a
href="detail/${user.id}" >详情</a></td>
</tr>
</c:forEach>
</tbody>
</table>
</body>
<a href="javascript:history.back(-1)">返回</a>
</html>
detail.jsp
<%@ 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=ISO-8859-1">
<title>信息详情页面</title>
</head>
<body>
<h2>详情信息</h2>
姓名<input type="text" readonly value="${user.name}">
年龄<input type="text" readonly value="${user.age}">
电话<input type="text" readonly value="${user.phone}">
<a href="javascript:history.back(-1)">返回</a>
</body>
</html>
add.jsp
<%@ 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=ISO-8859-1">
<title>ADD PAGE</title>
</head>
<body>
<h2>添加</h2>
<form action="save" method='post'>
用户名:<input type="text" name="name">
<p>
年龄:<input type="text" name="age">
<p>
手机号:<input type="text" name="phone">
<p>
<input type="submit" value="提交">
</form>
</body>
</html>
error.jsp
<%@ 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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
${errorMsg}
<a href="javascript:history.back(-1)">返回</a>
</body>
</html
运行结果:
http://localhost:8080/1_springjava_jdbcTemplate/index
微信公众号:
JAVA程序猿成长之路
分享学习资源,学习方法,记录程序员生活。