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官方文档完成了第一稿,相关的文章和仓库可以点击以下链接.这篇文章,主要是总结一下这个翻译项目 ...
随机推荐
- In-Memory:内存优化数据的持久化和还原
数据持久化是还原的前提,没有数据的持久化,就无法还原内存优化表的数据,SQL Server In-Memory OLTP的内存数据能够持久化存储,这意味着内存数据能够在SQL Server实例重启之后 ...
- 制作类似ThinkPHP框架中的PATHINFO模式功能(二)
距离上一次发布的<制作类似ThinkPHP框架中的PATHINFO模式功能>(文章地址:http://www.cnblogs.com/phpstudy2015-6/p/6242700.ht ...
- 700多个PHP版本随时切换,PHPWAMP共生模式与多档位综合教程。
最近有学生向我咨询如何同时建立多个不同PHP版本站点,并自定义任意版本,软件是否可以多开,PHPWAMP如何设置才能与其他的环境同时使用等问题,本文将一一解决. 简单介绍一下PHPWAMP 你们应该会 ...
- [DP之树形DP]
树形dp出了应该还是比计数dp要简单的 因为很好可以看出来 常用的是一个F记录子树内的 一个G记录子树外的 还有一种就是有环的做过要用状压搞一下 不说这么多直接上例题 [HAOI2015]T1 经典的 ...
- nginx服务器上遇到了acces denied,报错是fastCGI只要好好修改配置就行了
猜想: 懵逼 实践: 首先通用的方法,并没有解决问题. 1.修改php-fpm配置文件vim /etc/php-fpm.d/www.confuser = nginx 编辑用户为nginx ...
- CentOS部署yum本地源和共享
约定yum本地源的机器IP为192.168.1.100,需要访问共享源的IP为192.168.1.101 关闭并禁止selinux和firewalld 创建本地源 1.上传centos7光盘镜像到指定 ...
- LED的串联电阻值的计算
与LED串联的电阻被用于控制该LED导通时的电流量.为了计算电阻值,你需要知道输入电源电压(Vs,一般为5V),LED的正向电压(Vf)和你需要流过LED的电源(/)的数值. 其电阻欧姆值的计算公式( ...
- CodeForces 669D Little Artem and Dance
模拟. 每个奇数走的步长都是一样的,每个偶数走的步长也是一样的. 记$num1$表示奇数走的步数,$num2$表示偶数走的步数.每次操作更新一下$num1$,$num2$.最后输出. #pragma ...
- CSU 1810 Reverse
湖南省第十二届大学生计算机程序设计竞赛$H$题 规律,递推. 这种问题一看就有规律.可以按位统计对答案的贡献.即第$1$位对答案作出了多少贡献,第$2$位对答案作出了多少贡献.....累加和就是答案. ...
- JS 一些常用技巧
记录 JS 常用的技巧 1. 生成随机数 2. 解决浮点数问题 3. 无路可走时,看看是不是 事件 冒泡了...