Spring MVC(一)
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>
springmvc与struts2的区别
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(一)的更多相关文章
- 如何用Java类配置Spring MVC(不通过web.xml和XML方式)
DispatcherServlet是Spring MVC的核心,按照传统方式, 需要把它配置到web.xml中. 我个人比较不喜欢XML配置方式, XML看起来太累, 冗长繁琐. 还好借助于Servl ...
- Spring MVC重定向和转发以及异常处理
SpringMVC核心技术---转发和重定向 当处理器对请求处理完毕后,向其他资源进行跳转时,有两种跳转方式:请求转发与重定向.而根据要跳转的资源类型,又可分为两类:跳转到页面与跳转到其他处理器.对于 ...
- Spring MVC入门
1.什么是SpringMvc Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 M ...
- Spring7:基于注解的Spring MVC(下篇)
Model 上一篇文章<Spring6:基于注解的Spring MVC(上篇)>,讲了Spring MVC环境搭建.@RequestMapping以及参数绑定,这是Spring MVC中最 ...
- Spring6:基于注解的Spring MVC(上篇)
什么是Spring MVC Spring MVC框架是一个MVC框架,通过实现Model-View-Controller模式来很好地将数据.业务与展现进行分离.从这样一个角度来说,Spring MVC ...
- 高性能的关键:Spring MVC的异步模式
我承认有些标题党了,不过话说这样其实也没错,关于“异步”处理的文章已经不少,代码例子也能找到很多,但我还是打算发表这篇我写了好长一段时间,却一直没发表的文章,以一个更简单的视角,把异步模式讲清楚. 什 ...
- Java Spring mvc 操作 Redis 及 Redis 集群
本文原创,转载请注明:http://www.cnblogs.com/fengzheng/p/5941953.html 关于 Redis 集群搭建可以参考我的另一篇文章 Redis集群搭建与简单使用 R ...
- 深入分析Spring 与 Spring MVC容器
1 Spring MVC WEB配置 Spring Framework本身没有Web功能,Spring MVC使用WebApplicationContext类扩展ApplicationContext, ...
- spring mvc DispatcherServlet详解之前传---FrameworkServlet
做项目时碰到Controller不能使用aop进行拦截,从网上搜索得知:使用spring mvc 启动了两个context:applicationContext 和WebapplicationCont ...
- 我是如何进行Spring MVC文档翻译项目的环境搭建、项目管理及自动化构建工作的
感兴趣的同学可以关注这个翻译项目 . 我的博客原文 和 我的Github 前段时间翻译的Spring MVC官方文档完成了第一稿,相关的文章和仓库可以点击以下链接.这篇文章,主要是总结一下这个翻译项目 ...
随机推荐
- Android 音频管理器AudioManager
音频管理器AudioManager,通过它可以管理android系统的音量或直接让系统静音,依旧是通过调用getSystemService()方法获取音频管理器AudioManager对象,获取到该对 ...
- ASP.NET Core + Angular 2 Template for Visual Studio
多个月以来,我和多个Github上的社区贡献者一起建立支持库.包,我们最终的目的是希望完成这样一个作为起点的模板,也就是基于把Typescript代码和Angular2宿主在ASP.NET Core项 ...
- Java 在本地文件中查找固定字符串
适用范围:只适用于在文本文档中查找(如,txt.java.c等等,并不适用与doc.xls等等这些文件),可嵌套文件夹.但是对中文不支持. 例如:文件夹:F:/demo 子文件夹:F:/demo/er ...
- JS高程5.引用类型(5)Array类型的操作方法
一.操作方法 1.concat()方法 基于当前数组中的所有项创建一个新数组.具体说,是先创建当前数组的一个副本,然后将接收到的参数添加到这个副本的末尾,最后返回新构建的数组.在没有给concat() ...
- java编程思想笔记(一)——面向对象导论
1.1 抽象过程 1.所有编程语言都提供抽象编程机制. 2.人们所能够解决的问题的复杂性直接取决于抽象的类型(所抽象的是什么)和质量. 3."命令式"语言(basic,c等)都是对 ...
- kubernetes1.4 基础篇:Learn Kubernetes 1.4 by 6 steps
本教程受Kubernetes官方最新更新的文档所触发,之所以没有做单纯的翻译是因为如下几个原因: Kubernetes官方此教程基于minikube,个人对minikube可能有偏见,觉得像玩具. M ...
- 某种数列问题 (一场欢乐赛的T2)
个人觉得挺难的一道DP题 不会 没有思路 于是去找的正解 于是.. #include <iostream> #include <cstring> #define Max 100 ...
- String.split()分割字符串
string.split(s[, sep[, maxsplit]]) Return a list of the words of the string s. If the optional secon ...
- Maven之(九)依赖关系
在maven的管理体系中,各个项目组成了一个复杂的关系网,但是每个项目都是平等的,是个没有贵贱高低,众生平等的世界,全球每个项目从理论上来说都可以相互依赖.就是说,你跟开发spring的大牛们平起平坐 ...
- CoreJavaE10V1P3.8 第3章 Java的基本编程结构-3.8 控制流程(Control Flow)
通过使用条件语句.循环语句可以实现流程的控制. 3.8.1 块作用域(Block Scope) 块(Block)就是由一对花括号包围起来的部分.他指定了一个变量的生存范围,与一个方法的操作范围. Ja ...