Spring Web ,使用annotation和form标签库开发web应用(一)基础配置
2010-07-03 18:36
1051 查看
摘要:介绍如何配置Spring web用标注实现controller,并且介绍View部分如何用form标签如何与controller相呼应,并有完整的例子,要求读者掌握spring web(过去称为spring mvc)的一般用法, 并了解java web(servlet,jsp)应用的配置和规范。
为什么使用java annotation?
众所周知spring配置xml在一个应用变得原来越大的时候,配置成为一种负担,效率瓶颈可以解决,就是通过使用annotation来识别controller,不需要在配置文件里面来声明controller bean,也不需要声明controller mapping,只要在something-servlet.xml配置文件里面加上一句:
<context:component-scan base-package="com.somecompany.appname.controller" />
在something-servlet.xml被加载的时候会加载这个包里的所有controller。是不是减少了很多工作量?
准备:
springframwork的各个jar之间的关系很微妙,有些jar未必用得到,这里将常用的包都加到classpath中了
org.springframework.core
org.springframework.web
org.springframework.web.servlet
cglib
... ....
配置WEB-INF/web.xml添加spring-web支持(listener,servlet,filter):
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>icshtml</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>icshtml</servlet-name>
<url-pattern>/ics/*</url-pattern>
</servlet-mapping>
<filter>
<filter-name>httpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>httpMethodFilter</filter-name>
<servlet-name>icshtml</servlet-name>
</filter-mapping>
<!-- 下面这个filter是可选的,用来指定网页输出编码为UTF-8 -->
<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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
配置[b]WEB-INF/[b]icshtml-servlet.xml[/b][/b]
<?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:aop="http://www.springframework.org/schema/aop" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-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/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- icshtml-servlet.xml被加载的时候会加载这个包里的所有controller -->
<context:component-scan base-package="com.hundsun.ics.controller" />
<!-- 两个view resolver,后一个用来映射返回给客户端页面的jsp文件名,前一个是用来配置controllerbean,这里用不着,因为我们已经改用annotation来声明controller,为了保持兼容,保留原来的配置-->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" p:order="1" />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/views/" p:suffix=".jsp" p:order="2" />
<!-- 用户定义的bean -->
<bean id="user" class="ics.model.User" scope="session">
<!--如果要在controller中使用,这一句必不可少,因为controller是单例的,这个bean是session -->
<aop:scoped-proxy />
</bean>
</beans>
写一个登录页面("/WEB-INF/views/[b][b]login.jsp[b]" [b]):[/b][/b][/b][/b]
<%@ page contentType="text/html;charset=utf8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<html>
<head>
</head>
<body >
<form:form modelAttribute="user" target="_self" >
<font color="#FFFFFF">用户登录</font>
<form:input path="username" />
<form:password path="password" size="20"/>
<input type="submit" value="登录" name="B1" >
</form:form>
</body>
</html>
现在来编写Controller(src/com/hundsun/ics/controller/LoginController.java):
package com.hundsun.ics.controller;
import ics.model.User;
//标识这个类为Controller,在icshtml-servlet.xml加载的时候,该类会自动被加载。
@Controller
@SessionAttributes("user")
public class LoginController {
User user;
//自动注入User,这个是icshtml-servlet.xml里面已经配置的session scope的bean。
@Autowired
[b]LoginController(User,user){
this.user = user;
}
//当浏览器输入"http://somehost:8080/myapp/ics/login"时,会映射到该方法,
//然后返回login.jsp页面。
[/b]
@RequestMapping(value = "/
login
", method = RequestMethod.GET)
public String
login
() {
[b]
[b]
//do something
[/b]
return "login";
}
//当登录页面被提交时,会映射到该方法,注意,
[b]
[b][b]
在jsp[b]
提交时用post方法,才不会与上一个方法冲突
[/b][/b]
[/b]
[/b]
@RequestMapping(value = "/[b]
[b]
[b]
[b]
[b]
[b]
[b]
login
[/b]
[/b]
[/b]
[/b]
[/b]
[/b]", method = RequestMethod.POST)
public String login(@ModelAttribute("user") User myUser, BindingResult result, SessionStatus status) {
//do something
this.user.setUsername(myUser.getUsername());
model.put("user", [b]
[b]
[b]
[b]
[b]
[b]
[b]
[b]
[b]
[b]
user
[/b]
[/b]
[/b]
[/b]
[/b]
[/b]
[/b]
[/b]
[/b]);//必不可少,否则页面
[b]
[b]
[b]
[b]
[b][b]
[b]
c:out 语句会找不到。
[/b][/b]
[/b]
[/b]
[/b]
[/b]
[/b]
[/b]
System.out.println("User Name:" + user.getUsername());
return "welcome";
}
[/b]
}
[b]编写登录后的欢迎页
[b]
[b]
[b]("/WEB-INF/views/[b][b]welcome.jsp[b]" [b])[b]
:
[/b][/b][/b][/b][/b]
[/b]
[/b]
[/b]
[/b]
<%@ page contentType="text/html;charset=utf8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt"%>
<html>
<head>
</head>
<body >
<p>Welcome <c:out value="${user.username }"></c:out></p>
</body>
</html>
[/b]
为什么使用java annotation?
众所周知spring配置xml在一个应用变得原来越大的时候,配置成为一种负担,效率瓶颈可以解决,就是通过使用annotation来识别controller,不需要在配置文件里面来声明controller bean,也不需要声明controller mapping,只要在something-servlet.xml配置文件里面加上一句:
<context:component-scan base-package="com.somecompany.appname.controller" />
在something-servlet.xml被加载的时候会加载这个包里的所有controller。是不是减少了很多工作量?
准备:
springframwork的各个jar之间的关系很微妙,有些jar未必用得到,这里将常用的包都加到classpath中了
org.springframework.core
org.springframework.web
org.springframework.web.servlet
cglib
... ....
配置WEB-INF/web.xml添加spring-web支持(listener,servlet,filter):
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>icshtml</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>icshtml</servlet-name>
<url-pattern>/ics/*</url-pattern>
</servlet-mapping>
<filter>
<filter-name>httpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>httpMethodFilter</filter-name>
<servlet-name>icshtml</servlet-name>
</filter-mapping>
<!-- 下面这个filter是可选的,用来指定网页输出编码为UTF-8 -->
<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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
配置[b]WEB-INF/[b]icshtml-servlet.xml[/b][/b]
<?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:aop="http://www.springframework.org/schema/aop" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-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/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- icshtml-servlet.xml被加载的时候会加载这个包里的所有controller -->
<context:component-scan base-package="com.hundsun.ics.controller" />
<!-- 两个view resolver,后一个用来映射返回给客户端页面的jsp文件名,前一个是用来配置controllerbean,这里用不着,因为我们已经改用annotation来声明controller,为了保持兼容,保留原来的配置-->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" p:order="1" />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/views/" p:suffix=".jsp" p:order="2" />
<!-- 用户定义的bean -->
<bean id="user" class="ics.model.User" scope="session">
<!--如果要在controller中使用,这一句必不可少,因为controller是单例的,这个bean是session -->
<aop:scoped-proxy />
</bean>
</beans>
写一个登录页面("/WEB-INF/views/[b][b]login.jsp[b]" [b]):[/b][/b][/b][/b]
<%@ page contentType="text/html;charset=utf8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<html>
<head>
</head>
<body >
<form:form modelAttribute="user" target="_self" >
<font color="#FFFFFF">用户登录</font>
<form:input path="username" />
<form:password path="password" size="20"/>
<input type="submit" value="登录" name="B1" >
</form:form>
</body>
</html>
现在来编写Controller(src/com/hundsun/ics/controller/LoginController.java):
package com.hundsun.ics.controller;
import ics.model.User;
//标识这个类为Controller,在icshtml-servlet.xml加载的时候,该类会自动被加载。
@Controller
@SessionAttributes("user")
public class LoginController {
User user;
//自动注入User,这个是icshtml-servlet.xml里面已经配置的session scope的bean。
@Autowired
[b]LoginController(User,user){
this.user = user;
}
//当浏览器输入"http://somehost:8080/myapp/ics/login"时,会映射到该方法,
//然后返回login.jsp页面。
[/b]
@RequestMapping(value = "/
login
", method = RequestMethod.GET)
public String
login
() {
[b]
[b]
//do something
[/b]
return "login";
}
//当登录页面被提交时,会映射到该方法,注意,
[b]
[b][b]
在jsp[b]
提交时用post方法,才不会与上一个方法冲突
[/b][/b]
[/b]
[/b]
@RequestMapping(value = "/[b]
[b]
[b]
[b]
[b]
[b]
[b]
login
[/b]
[/b]
[/b]
[/b]
[/b]
[/b]", method = RequestMethod.POST)
public String login(@ModelAttribute("user") User myUser, BindingResult result, SessionStatus status) {
//do something
this.user.setUsername(myUser.getUsername());
model.put("user", [b]
[b]
[b]
[b]
[b]
[b]
[b]
[b]
[b]
[b]
user
[/b]
[/b]
[/b]
[/b]
[/b]
[/b]
[/b]
[/b]
[/b]);//必不可少,否则页面
[b]
[b]
[b]
[b]
[b][b]
[b]
c:out 语句会找不到。
[/b][/b]
[/b]
[/b]
[/b]
[/b]
[/b]
[/b]
System.out.println("User Name:" + user.getUsername());
return "welcome";
}
[/b]
}
[b]编写登录后的欢迎页
[b]
[b]
[b]("/WEB-INF/views/[b][b]welcome.jsp[b]" [b])[b]
:
[/b][/b][/b][/b][/b]
[/b]
[/b]
[/b]
[/b]
<%@ page contentType="text/html;charset=utf8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt"%>
<html>
<head>
</head>
<body >
<p>Welcome <c:out value="${user.username }"></c:out></p>
</body>
</html>
[/b]
相关文章推荐
- Spring Web ,使用annotation和form标签库开发web应用(二)请求的映射
- Spring Web ,使用annotation和form标签库开发web应用(二)请求的映射
- Spring Web ,使用annotation和form标签库开发web应用(一)基础配置
- spring boot开发遇到坑之spring-boot-starter-web配置文件使用教程
- Java Web开发之Spring | SpringMvc | Mybatis | Hibernate整合、配置、使用
- 30分钟学会使用Spring Web Services基础开发
- 关于使用Spring和hibernate开发web程序的配置说明和简单实例的详细说明
- 30分钟学会使用Spring Web Services基础开发
- 30分钟学会使用Spring Web Services基础开发
- javaweb开发基础及Tomcat服务器的简单使用、配置
- Web前端开发最佳实践(5):正确闭合HTML标签,停止使用不标准的标签和属性
- SpringMVC+Spring4+hibernate5使用java类配置spring和springmvc环境(不用配置web.xml)
- 一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-ORM访问器及其配置
- 标准版eclipse配置J2EE插件,使用maven创建web项目(spring JDBC)
- spring配置文件<import>标签中使用${}占位符获得配置文件的属性值
- 扩展Spring——使用 Annotation将配置资源注入到Bean中
- spring 在web.xml 里面如何使用多个xml配置文件
- SSH开发环境的配置:web.xml、Spring集成hibernate和Spring集成Struts2
- Python web框架Django学习(1)——在win7 64bit下配置开发环境Django:一个可以使Web开发工作愉快并且高效的Web开发框架。 使用Django,使你能够以最小的代价构建和
- SpringBoot--使用Thymeleaf模板开发web项目