您的位置:首页 > 编程语言 > Java开发

Spring实战(第4版) Spring Inaction 笔记(第五章)Spring MVC

2016-11-30 10:15 423 查看
web app 与application的区别就在于pom.xml中的一行 
<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";
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐