纯Java配置SpringMvc-JSP-JdbcTemplate

包结构

环境搭建 参考《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程序猿成长之路

                                                       分享学习资源,学习方法,记录程序员生活。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值