MVC这种设计模式,不光运用于Web领域,而且也能用于非Web领域,MVC特指一种表现层设计模式,不限于Java语言

spring mvc属于spring框架的后续产品,用在基于MVC的表现层开发,类似于struts2框架

springmvc快速入门

步骤一:创建springmvc-day01的一个web应用

步骤二:导入springioc,springweb , springmvc相关的jar包

步骤三:在/WEB-INF/下创建web.xml文件

<!-- 注册springmvc框架核心控制器 -->
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>    springmvc工作的时候会默认的去/WEB-INF/目录下查找DispatcherServlet-servlet.xml配置文件     名字一致
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>*.action</url-pattern>注意这里是*.action,不是/*   因为/* 访问jsp也会访问该映射
    </servlet-mapping>

步骤四:创建HelloAction.java控制器类

ModelAndView :表示向视图封装的数据和路径。
/**
 * 控制器
 */
public class HelloAction implements Controller{
    /**
     * 业务方法
     */
    public ModelAndView handleRequest(HttpServletRequest requqest,HttpServletResponse response) throws Exception {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("message","这是我的第一个springmvc应用程序");
        modelAndView.setViewName("/jsp/success.jsp");
        return modelAndView;
    }
}

步骤五:在/WebRoot/下创建jsp/success.jsp

<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>这是我的第一个springmvc应用程序</title>
  </head>
  <body>
    success.jsp<br/>
    ${message}
  </body>
</html>

步骤六:在/WEB-INF/创建DispatcherServlet-servlet.xml配置文件,xml头部信息与spring.xml相同

注意:该配置文件的命名规则:web.xml文件中配置的<servlet-name>的值-servlet.xml

DispatcherServlet-servlet.xml

<?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"
      xmlns:aop="http://www.springframework.org/schema/aop"
      xmlns:tx="http://www.springframework.org/schema/tx"
      xmlns:mvc="http://www.springframework.org/schema/mvc"
      xsi:schemaLocation="

      http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context-3.0.xsd

      http://www.springframework.org/schema/aop
      http://www.springframework.org/schema/aop/spring-aop-3.0.xsd

      http://www.springframework.org/schema/tx
      http://www.springframework.org/schema/tx/spring-tx-3.0.xsd

      http://www.springframework.org/schema/mvc
      http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd

      ">

    <!-- 控制器(程序员)   开发的action必须配置到spring IOC容器中,即必须配置bean
    name:是访问的请求路径 class:是处理器类
--> 单例 <bean name="/hello.action" class="cn.itcast.javaee.springmvc.base.HelloAction"></bean> 这里是name,不是id,spring中配置bean是id, <!-- 映射器(框架) --> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean> 表示将bean标签的name属性当做url请求,可选,即可以不配置这里 M <!-- 适配器(框架) --> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean> 表示用于查找实现了Controller接口的action类,可选的 C <!-- 视图解析器(框架) --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean> 表示通过ModelAndView对象中封装的视图名找到真正的jsp页面,可选的 V </beans>

步骤七:部署web应用到tomcat中,通过浏览器访问如下URL:

http://127.0.0.1:8080/springmvc-day01/hello.action

加载自定义目录下的springmvc.xml配置文件

在默认情况下:springmvc框架的配置文件必须叫<servlet-name>-servlet.xml。且必须放在/WEB-INF/目录下,除此之外,我们也可以在web.xml文件中,为DispatcherServlet配置一个初始化参数,

让它去我们指定的目录下加载springmvc.xml配置文件 ,web.xml代码如下:

<!-- 注册springmvc框架核心控制器 -->
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name> 这里的名字是固定的,且大小写敏感
            <param-value>/WEB-INF/classes/cn/itcast/javaee/springmvc/config/springmvc.xml</param-value>    名字随意,可以自定义
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>

如果springmvc.xml配置文件放在src目录下,web.xml代码如下:

<!-- 注册springmvc框架核心控制器 -->
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>

视图解析器InternalResourceViewResolver【解析视图逻辑名对应的真实路径】

ModelAndView对象中即可以封装真实视图路径名,也可以封装视图路径的逻辑名,如果封装的是真实路径名,视图解析器可以不配置,但是如果使用了逻辑视图名,必须配置视图解析器,指定前缀,后缀等

springmvc.xml代码如下:

<?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"

      xsi:schemaLocation="

      http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

      http://www.springframework.org/schema/mvc
      http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd

      ">

      <!-- 注册Action(必须配置) -->
      <bean name="/hello.action" class="cn.itcast.javaee.springmvc.app07.HelloAction"></bean>

      <!--
          如果Action中书写的是视图逻辑名称,那么视图解析器就必须配置
          如果Action中书写的是视图真实名称,那么视图解析器就可选配置
      -->
      <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
              <!-- 路径前缀 -->
              <property name="prefix" value="/jsp/"/>
              <!-- 路径后缀 -->
              <property name="suffix" value=".jsp"/>
              <!-- 前缀+视图逻辑名+后缀=真实路径 -->
      </bean>

</beans>      

Action类代码如下:

modelAndView.setViewName("success");逻辑名称

映射器Mapping【什么样的请求交给Action】

1)  org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping(核心)

将程序员定义的Action所对应的<bean>标签的name属性作为请求路径

      <!-- 注册控制器(程序员) -->
      <bean name="/add.action" class="cn.itcast.javaee.springmvc.mapping.UserAction"></bean>

      <!-- 注册映射器(handler包)(框架) -->
      <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>

2)  org.springframework.web.servlet.handler.SimpleUrlHandlerMapping

/delete.action和/update.action和/find.action请求路径都交由<bean>标签为id的Action,即

多个路径对应同一个Action

    <!-- 注册控制器(程序员) -->
      <bean id="userActionID" class="cn.itcast.javaee.springmvc.mapping.UserAction"></bean>   配置id还是name取决于该acting是否几个请求公用,如果是几个请求都访问该action,用id,否则用name

      <!-- 注册映射器(handler包)(框架) -->
      <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">  将多个请求映射到同一个action上去,当然也可以采用上面的BeanNameUrlHandlerMapping的方法配置多个。
              <property name="mappings">
                  <props>
                      <prop key="/delete.action">userActionID</prop>
                      <prop key="/update.action">userActionID</prop>
                      <prop key="/find.action">userActionID</prop>
                  </props>
              </property>
      </bean>

当然也可以使用<bean name="/add.action" class="cn.itcast.javaee.springmvc.mapping.UserAction"></bean>  配置多个。

适配器Adapter【Action实现什么接口】

适配器是去查找实现了Controller接口的Action

org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter

public class EmpAction implements Controller{
    public ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse response) throws Exception {
        System.out.println("EmpAction::handleRequest");
        request.setCharacterEncoding("UTF-8");
        String username = request.getParameter("username");
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("message",username);
        modelAndView.setViewName("/jsp/success.jsp");
        return modelAndView;
    }
}

springmvc.xml:

<?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"

      xsi:schemaLocation="

      http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

      http://www.springframework.org/schema/mvc
      http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd

      ">

    <!-- EmpAction处理类 -->
    <bean name="/add.action" class="cn.itcast.javaee.springmvc.app09.EmpAction"></bean>  

    <!-- 映射器(省) --> 

    <!-- 适配器 -->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>  框架会自动的去查找实现了Controller接口的Action,可省,适配器有很多种,这个是默认的,可以不配置

    <!-- 视图解析器(省) -->  

</beans>      

Action类实现Controller接口的缺点:

1.与原生servlet耦合了,因为handlerRequest方法中传入了request,response参数

2.如果参数传入过多,实现接口的action中收集前端传入的参数就比较麻烦,能用实体类接受前端传入参数最好

JSP转到JSP/html的控制器ParameterizableViewController 

1)  org.springframework.web.servlet.mvc.ParameterizableViewController

如果请求是/hello.action的请求路径,则直接跳转到/jsp/success.jsp页面,不经过程序员定义的控制器Action

    <!-- /index.action请求,直接转发到/index.jsp页面 -->
      <bean name="/index.action" class="org.springframework.web.servlet.mvc.ParameterizableViewController">
              <property name="viewName" value="/index.jsp"/>
      </bean>

     <!-- 注册视图解析器(view包)(框架)
      <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
              <property name="prefix" value="/"/>
              <property name="suffix" value=".jsp"/>
      </bean>
      -->

2)  org.springframework.web.servlet.mvc.AbstractCommandController

能够以实体的形式,收集客户端参数

public class AdminAction extends AbstractCommandController{
//private Admin admin;注意这里不能用类似struts2的方法,因为spring产生的action是单例的。 public AdminAction(){ this.setCommandClass(Admin.class); } @Override protected ModelAndView handle(HttpServletRequest request,HttpServletResponse response, Object obj, BindException bindException)throws Exception { System.out.println("AdminAction::handle"); ModelAndView modelAndView = new ModelAndView(); Admin admin = null; if(obj instanceof Admin){ admin = (Admin) obj; } modelAndView.addObject("username",admin.getUsername()); modelAndView.addObject("gender",admin.getGender()); modelAndView.addObject("hiredate",admin.getHiredate()); modelAndView.setViewName("/jsp/success.jsp"); return modelAndView; } }

obj表示封装后的实体,bindException表示封装时产生的异常

注意,spring中的action默认是单例的,不同于Struts2,所以这里不能用struts2中的方法,在action中定义一个实体来接收前端的数据,Struts2中的action是多例的、

      <!-- 请求处理类 -->
      <bean name="/add.action" class="cn.itcast.javaee.springmvc.controller.AdminAction"></bean>

      <!-- 映射器 -->
      <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>演示二个控制器</title>
  </head>
  <body>

    <form action="${pageContext.request.contextPath}/add.action" method="POST">
        <table border="2" align="center">
            <tr>
                <th>姓名</th>
                <td><input type="text" name="username"/></td>     这里的名称要与javabean中一致
            </tr>
            <tr>
                <th>性别</th>
                <td>
                    <input type="radio" name="gender" value="男"/>男
                    <input type="radio" name="gender" value="女" checked/>女
                </td>
            </tr>
            <tr>
                <th>入职时间</th>
                <td>
                    <input type="text" name="hiredate" value="2015-5-10"/>
                </td>
            </tr>
            <tr>
                <td colspan="2" align="center">
                    <input type="submit" value="提交"/>
                </td>
            </tr>
        </table>
    </form>

  </body>
</html>

日期转换器和编码过滤器

1)  在默认情况下,springmvc不能将String类型转成Date类型,必须自定义类型转换器

public class AdminAction extends AbstractCommandController{
    @Override
    protected void initBinder(HttpServletRequest request,ServletRequestDataBinder binder) throws Exception {
        binder.registerCustomEditor(Date.class,new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),true));
    }
package cn.itcast.javaee.springmvc.app10;

import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.validation.BindException;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractCommandController;

/**
 * 单例
 * 处理类
 * @author AdminTC
 */
@SuppressWarnings("deprecation")
public class EmpAction extends AbstractCommandController{
    public EmpAction(){
        //将表单参数封装到Emp对象中去
        this.setCommandClass(Emp.class);
    }
    /**
     * 自定义类型转换器,将String->Date类型(格式yyyy-MM-dd)
     */
    @Override
    protected void initBinder(HttpServletRequest request,ServletRequestDataBinder binder) throws Exception {
        //向springmvc内部注入一个自定义的类型转换器
        //参数一:将String转成什么类型的字节码
        //参数二:自定义转换规则
        //true表示该日期字段可以为空
        binder.registerCustomEditor(
                Date.class,
                new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),true));
    }
    /**
     * obj表示封装后的实体
     * error表示封装时产生的异常
     */
    @Override
    protected ModelAndView handle(
            HttpServletRequest request,
            HttpServletResponse response,
            Object obj,
            BindException error)throws Exception {

        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("message","增加员工成功");

        Emp emp = (Emp) obj;
        System.out.println(emp.getUsername()+":"+emp.getGender()+":"+emp.getHiredate().toLocaleString());

        //将Emp封装到ModeAndView对象中
        modelAndView.addObject("emp",emp);

        modelAndView.setViewName("/jsp/success.jsp");
        return modelAndView;
    }
}

日期回显:

<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>  jstl标签库
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <body>
    success.jsp<br/>
    成功<br/>
    ${requestScope.message}<br/>
    姓名:${requestScope.emp.username}<br/>
    性别:${requestScope.emp.gender}<br/>

    入职时间:${requestScope.emp.hiredate}<br/>  这里显示的日期格式不是常规的,要转换成方便看的格式。
    <hr/>
    入职时间:<fmt:formatDate
                value="${requestScope.emp.hiredate}"
                type="date"
                dateStyle="medium"
            />

    <!--
        1)fmt:formatDate 来源于 http://java.sun.com/jsp/jstl/fmt
        2)fmt:formatDate作用是格式化日期的显示,例如:2015年5月10日 星期日
        3)value表示需要格式化的值
        4)type表示显示日期,时间,都显示
          type=date表示只显示日期
          type=time表示只显示时间
          type=both表示日期时间均显示
        5)dateStyle表示显示日期的格式:short/medium/default/long/full
    -->

  </body>
</html>

2) spring提供的,专用于解决POST提交中文乱码问题,需要在web.xml文件中配置

<!-- 编码过滤器 -->
    <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>

springmvcstruts2的区别

1) springmvc的入口是一个servlet,即前端控制器,例如:*.action

struts2入口是一个filter过虑器,即前端过滤器,例如:/*

2)springmvc是基于方法开发,传递参数是通过方法形参,可以设计为单例

struts2是基于类开发,传递参数是通过类的属性,只能设计为多例

3)springmvc通过参数解析器是将request对象内容进行解析成方法形参,将响应数据和页面封装成

ModelAndView对象,最后又将模型数据通过request对象传输到页面

struts采用值栈存储请求和响应的数据,通过OGNL存取数据

员工管理系统--增加员工

技术:springmvc + spring + jdbc + oracle

1.数据库设计

--oracle

create table emps(
    id ) primary key,
    username ) not null,
    salary ,) not null,
    hiredate date not null
);

desc emps;

2.实体类javabean

package cn.itcast.emp.entity;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

/**
 * 员工
 * @author AdminTC
 */
public class Emp {
    private String id;//编号
    private String username;//姓名
    private Double salary;//薪水
    private Date hiredate;//入职时间
    public Emp(){}
    public String getId() {
        return UUID.randomUUID().toString();   自动生成uid
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public Double getSalary() {
        return salary;
    }
    public void setSalary(Double salary) {
        this.salary = salary;
    }
    public Date getHiredate() {
        return hiredate;
    }
    public void setHiredate(Date hiredate) {
        this.hiredate = hiredate;
    }
}

3.工具类

/**
 * 工具类
 * @author AdminTC
 */
public class JdbcUtil {
    /**
     * 去src目录下加载c3p0-config.xml配置文件
     */
    private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
    /**
     * 获取数据源
     */
    public static ComboPooledDataSource getDataSource() {
        return dataSource;
    }
}

c3p0-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
    <default-config>
        <property name="driverClass">oracle.jdbc.driver.OracleDriver</property>
        <property name="jdbcUrl">jdbc:oracle:thin:@127.0.0.1:1521:orcl</property>
        <property name="user">scott</property>
        <property name="password">tiger</property>
        <property name="acquireIncrement">2</property>
        <property name="initialPoolSize">5</property>
        <property name="minPoolSize">1</property>
        <property name="maxPoolSize">5</property>
    </default-config>
</c3p0-config>

4. dao

package cn.itcast.emp.dao;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.sql.Date;
import org.apache.commons.dbutils.QueryRunner;
import cn.itcast.emp.entity.Emp;
import cn.itcast.emp.util.JdbcUtil;

/**
 * 员工管理模块
 * 持久层实现类
 * @author AdminTC
 */
public class EmpDao {
    /**
     * 增加员工
     */
    public void add(Emp emp) throws Exception{
        QueryRunner runner = new QueryRunner(JdbcUtil.getDataSource());
        String sql = "insert into emps(id,username,salary,hiredate) values(?,?,?,?)";
        Object[] params = {emp.getId(),emp.getUsername(),emp.getSalary(),emp.getHiredate()};
        runner.update(sql,params);
    }

    public static void main(String[] args) throws Exception{

        Emp emp = new Emp();
        emp.setId("a140a519-6168-4a97-a753-5c5e5cf0a8b2");
        emp.setUsername("哈哈");
        emp.setSalary(7000D);

        String year = "15";
        String month = "5月";
        String date = "10";
        String str = date+"-"+month+"-"+year;
        DateFormat df = new SimpleDateFormat("dd-MM-yy");

        emp.setHiredate(df.parse(str));

        EmpDao dao = new EmpDao();
        dao.add(emp);

    }
}

5.service

package cn.itcast.emp.service;

import cn.itcast.emp.dao.EmpDao;
import cn.itcast.emp.entity.Emp;

/**
 * 员工管理模块
 * 业务层实现类
 * @author AdminTC
 */
public class EmpService {
    private EmpDao empDao;
    public void setEmpDao(EmpDao empDao) {
        this.empDao = empDao;
    }
    /**
     * 增加员工
     */
    public void register(Emp emp) throws Exception{
        empDao.add(emp);
    }
}

6.action

package cn.itcast.emp.action;

import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.validation.BindException;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractCommandController;
import cn.itcast.emp.entity.Emp;
import cn.itcast.emp.service.EmpService;

/**
 * 员工管理模块
 * 控制器
 * @author AdminTC
 */
@SuppressWarnings("deprecation")
public class EmpAction extends AbstractCommandController{
    //业务层
    private EmpService empService;
    public void setEmpService(EmpService empService) {
        this.empService = empService;
    }
    //将表单参数封装到Emp实体中
    public EmpAction(){
        this.setCommandClass(Emp.class);
    }
    //自定义String->Date的转换器
    @Override
    protected void initBinder(HttpServletRequest request,ServletRequestDataBinder binder) throws Exception {
        binder.registerCustomEditor(
                Date.class,
                new CustomDateEditor(new SimpleDateFormat("dd-MM-yy"),true));
    }
    @Override
    protected ModelAndView handle(
            HttpServletRequest request,
            HttpServletResponse response,
            Object obj,
            BindException error)
            throws Exception {
        ModelAndView modelAndView = new ModelAndView();
        Emp emp = (Emp) obj;
        System.out.println(emp.getHiredate().toLocaleString());
        empService.register(emp);

        modelAndView.addObject("message","操作成功");
        modelAndView.setViewName("success");
        return modelAndView;
    }
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <!-- 注册springmvc核心控制器 -->
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

    <!-- 注册争对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>

</web-app>

spring.xml

<?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"

      xsi:schemaLocation="

      http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

      http://www.springframework.org/schema/mvc
      http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd

      ">

      <!-- 注册EmpDao类 -->
      <bean id="empDaoID" class="cn.itcast.emp.dao.EmpDao"></bean>

      <!-- 注册EmpService类 -->
      <bean id="empServiceID" class="cn.itcast.emp.service.EmpService">
              <property name="empDao" ref="empDaoID"/>
      </bean>

      <!-- 注册Action -->
      <bean name="/add.do" class="cn.itcast.emp.action.EmpAction">
          <property name="empService" ref="empServiceID"/>
      </bean>

      <!-- 映射器 -->
      <!-- 适配器 -->

      <!-- 视图解析器 -->
      <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
              <property name="prefix" value="/"/>
              <property name="suffix" value=".jsp"/>
      </bean>

</beans>        

index.jsp

<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>员工管理系统</title>
  </head>
  <body>
        <form action="${pageContext.request.contextPath}/add.do" method="POST">
        <table border="2" align="center">
            <tr>
                <th>姓名</th>
                <td><input type="text" name="username"/></td>
            </tr>
            <tr>
                <th>期望薪水</th>
                <td>
                    <input type="text" name="salary" value="7000"/>
                </td>
            </tr>
            <tr>
                <th>入职时间</th>
                <td>
                    <input type="text" name="hiredate" value="2015-5-10"/>
                </td>
            </tr>
            <tr>
                <td colspan="2" align="center">
                    <input type="submit" value="提交"/>
                </td>
            </tr>
        </table>
    </form>
  </body>
</html>

success.jsp

<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <body>
    /success.jsp<br/>
    ${requestScope.message}<br/>
  </body>
</html>

Spring MVC(一)的更多相关文章

  1. 如何用Java类配置Spring MVC(不通过web.xml和XML方式)

    DispatcherServlet是Spring MVC的核心,按照传统方式, 需要把它配置到web.xml中. 我个人比较不喜欢XML配置方式, XML看起来太累, 冗长繁琐. 还好借助于Servl ...

  2. Spring MVC重定向和转发以及异常处理

    SpringMVC核心技术---转发和重定向 当处理器对请求处理完毕后,向其他资源进行跳转时,有两种跳转方式:请求转发与重定向.而根据要跳转的资源类型,又可分为两类:跳转到页面与跳转到其他处理器.对于 ...

  3. Spring MVC入门

    1.什么是SpringMvc Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 M ...

  4. Spring7:基于注解的Spring MVC(下篇)

    Model 上一篇文章<Spring6:基于注解的Spring MVC(上篇)>,讲了Spring MVC环境搭建.@RequestMapping以及参数绑定,这是Spring MVC中最 ...

  5. Spring6:基于注解的Spring MVC(上篇)

    什么是Spring MVC Spring MVC框架是一个MVC框架,通过实现Model-View-Controller模式来很好地将数据.业务与展现进行分离.从这样一个角度来说,Spring MVC ...

  6. 高性能的关键:Spring MVC的异步模式

    我承认有些标题党了,不过话说这样其实也没错,关于“异步”处理的文章已经不少,代码例子也能找到很多,但我还是打算发表这篇我写了好长一段时间,却一直没发表的文章,以一个更简单的视角,把异步模式讲清楚. 什 ...

  7. Java Spring mvc 操作 Redis 及 Redis 集群

    本文原创,转载请注明:http://www.cnblogs.com/fengzheng/p/5941953.html 关于 Redis 集群搭建可以参考我的另一篇文章 Redis集群搭建与简单使用 R ...

  8. 深入分析Spring 与 Spring MVC容器

    1 Spring MVC WEB配置 Spring Framework本身没有Web功能,Spring MVC使用WebApplicationContext类扩展ApplicationContext, ...

  9. spring mvc DispatcherServlet详解之前传---FrameworkServlet

    做项目时碰到Controller不能使用aop进行拦截,从网上搜索得知:使用spring mvc 启动了两个context:applicationContext 和WebapplicationCont ...

  10. 我是如何进行Spring MVC文档翻译项目的环境搭建、项目管理及自动化构建工作的

    感兴趣的同学可以关注这个翻译项目 . 我的博客原文 和 我的Github 前段时间翻译的Spring MVC官方文档完成了第一稿,相关的文章和仓库可以点击以下链接.这篇文章,主要是总结一下这个翻译项目 ...

随机推荐

  1. In-Memory:内存优化数据的持久化和还原

    数据持久化是还原的前提,没有数据的持久化,就无法还原内存优化表的数据,SQL Server In-Memory OLTP的内存数据能够持久化存储,这意味着内存数据能够在SQL Server实例重启之后 ...

  2. 制作类似ThinkPHP框架中的PATHINFO模式功能(二)

    距离上一次发布的<制作类似ThinkPHP框架中的PATHINFO模式功能>(文章地址:http://www.cnblogs.com/phpstudy2015-6/p/6242700.ht ...

  3. 700多个PHP版本随时切换,PHPWAMP共生模式与多档位综合教程。

    最近有学生向我咨询如何同时建立多个不同PHP版本站点,并自定义任意版本,软件是否可以多开,PHPWAMP如何设置才能与其他的环境同时使用等问题,本文将一一解决. 简单介绍一下PHPWAMP 你们应该会 ...

  4. [DP之树形DP]

    树形dp出了应该还是比计数dp要简单的 因为很好可以看出来 常用的是一个F记录子树内的 一个G记录子树外的 还有一种就是有环的做过要用状压搞一下 不说这么多直接上例题 [HAOI2015]T1 经典的 ...

  5. nginx服务器上遇到了acces denied,报错是fastCGI只要好好修改配置就行了

    猜想: 懵逼 实践: 首先通用的方法,并没有解决问题. 1.修改php-fpm配置文件vim /etc/php-fpm.d/www.confuser = nginx        编辑用户为nginx ...

  6. CentOS部署yum本地源和共享

    约定yum本地源的机器IP为192.168.1.100,需要访问共享源的IP为192.168.1.101 关闭并禁止selinux和firewalld 创建本地源 1.上传centos7光盘镜像到指定 ...

  7. LED的串联电阻值的计算

    与LED串联的电阻被用于控制该LED导通时的电流量.为了计算电阻值,你需要知道输入电源电压(Vs,一般为5V),LED的正向电压(Vf)和你需要流过LED的电源(/)的数值. 其电阻欧姆值的计算公式( ...

  8. CodeForces 669D Little Artem and Dance

    模拟. 每个奇数走的步长都是一样的,每个偶数走的步长也是一样的. 记$num1$表示奇数走的步数,$num2$表示偶数走的步数.每次操作更新一下$num1$,$num2$.最后输出. #pragma ...

  9. CSU 1810 Reverse

    湖南省第十二届大学生计算机程序设计竞赛$H$题 规律,递推. 这种问题一看就有规律.可以按位统计对答案的贡献.即第$1$位对答案作出了多少贡献,第$2$位对答案作出了多少贡献.....累加和就是答案. ...

  10. JS 一些常用技巧

    记录 JS 常用的技巧 1. 生成随机数 2. 解决浮点数问题 3. 无路可走时,看看是不是 事件 冒泡了...