web app 与application的区别就在于pom.xml中的一行
DataConfig展示了如何生成一个内存数据库的技巧,使用jdbc
对Controller的技巧展示有如下几种
<packaging>war</packaging>
传统WebApp一切开始于web.xml,
web.xml 的配置请看http://blog.csdn.net/believejava/article/details/43229361
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
import spittr.web.WebConfig;
public class SpitterWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
//需要ContextLoaderListener需要加载的bean类似下面的XML,加载其他的所有bean,一般是中间层或者数据层组件
// <context-param>
// <param-name>contextConfigLocation</param-name>
// <param-value>classpath:applicationContext.xml,classpath:daoContext.xml</param-value>
// </context-param>
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[] { RootConfig.class };
}
//加载定义在WebConfig类中的各种bean等,类似下面的XML,主要加载控制器,视图解析器,处理器映射,
// <servlet>
// <servlet-name>mvc-dispatcher</servlet-name>
// <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
// <init-param>
// <param-name>contextConfigLocation</param-name>
// <param-value>classpath:mvc-dispatcher-servlet.xml</param-value>
// </init-param>
// <load-on-startup>1</load-on-startup>
// </servlet>
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] { WebConfig.class };
}
// 等同于
// <servlet-mapping>
// <servlet-name>mvc-dispatcher</servlet-name>
// <url-pattern>/</url-pattern>
// </servlet-mapping>
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
web.xml可以和这个类共存,但建议该类取代web.xml
WebConfig内容如下
@Configuration
//等价于<mvc:annotation-driven>,即启用Spring MVC
@EnableWebMvc
@ComponentScan("spittr.web") //启用组件扫描
public class WebConfig extends WebMvcConfigurerAdapter {
//启用jsp视图解析器,这样比如某个Controller返回home。就自动变成/WEB-INF/views/home.jsp
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
//配置静态资源的处理
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// TODO Auto-generated method stub
super.addResourceHandlers(registry);
}
}
RootConfig 把自身排除了
@Configuration
@Import(DataConfig.class)
//设置WebPackage类不被自动扫描
@ComponentScan(basePackages={"spittr"},
excludeFilters={
@Filter(type=FilterType.CUSTOM, value=WebPackage.class)
})
public class RootConfig {
public static class WebPackage extends RegexPatternTypeFilter {
public WebPackage() {
super(Pattern.compile("spittr\\.web"));
}
}
}
DataConfig展示了如何生成一个内存数据库的技巧,使用jdbc
@Configuration
public class DataConfig {
@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.addScript("schema.sql")
.build();
}
@Bean
public JdbcOperations jdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}
对这个数据库的操作也非常简单
@Repository
public class JdbcSpitterRepository implements SpitterRepository {
private JdbcOperations jdbc;
@Autowired
public JdbcSpitterRepository(JdbcOperations jdbc) {
this.jdbc = jdbc;
}
public Spitter save(Spitter spitter) {
jdbc.update(
"insert into Spitter (username, password, first_name, last_name, email)" +
" values (?, ?, ?, ?, ?)",
spitter.getUsername(),
spitter.getPassword(),
spitter.getFirstName(),
spitter.getLastName(),
spitter.getEmail());
return spitter; // TODO: Determine value for id
}
public Spitter findByUsername(String username) {
return jdbc.queryForObject(
"select id, username, null, first_name, last_name, email from Spitter where username=?",
new SpitterRowMapper(),
username);
}
private static class SpitterRowMapper implements RowMapper<Spitter> {
public Spitter mapRow(ResultSet rs, int rowNum) throws SQLException {
return new Spitter(
rs.getLong("id"),
rs.getString("username"),
null,
rs.getString("first_name"),
rs.getString("last_name"),
rs.getString("email"));
}
}
}
对Controller的技巧展示有如下几种
//相同路径的映射,返回home.jsp
@Controller
@RequestMapping({"/", "/myhomepage"})
public class HomeController {
@RequestMapping(method = GET)
public String home(Model model) {
return "home";
}
}
保存数据库,重定向,参数传递的基本用法如下
@Controller
@RequestMapping("/spittles")
public class SpittleController {
private static final String MAX_LONG_AS_STRING = "9223372036854775807";
private SpittleRepository spittleRepository;
@Autowired
public SpittleController(SpittleRepository spittleRepository) {
this.spittleRepository = spittleRepository;
}
@RequestMapping(method=RequestMethod.GET)
public List<Spittle> spittles(
@RequestParam(value="max", defaultValue=MAX_LONG_AS_STRING) long max,
@RequestParam(value="count", defaultValue="20") int count) {
return spittleRepository.findSpittles(max, count);
}
@RequestMapping(value="/{spittleId}", method=RequestMethod.GET)
public String spittle(
@PathVariable("spittleId") long spittleId,
Model model) {
model.addAttribute(spittleRepository.findOne(spittleId));
return "spittle";
}
//保存数据库,以及重定向的操作
@RequestMapping(method=RequestMethod.POST)
public String saveSpittle(SpittleForm form, Model model) throws Exception {
spittleRepository.save(new Spittle(null, form.getMessage(), new Date(),
form.getLongitude(), form.getLatitude()));
return "redirect:/spittles";
}
}