??? 出來工作都有一年了,做過不少項目,大多數(shù)都是以springmvc為基礎(chǔ),每次搭建項目的時候,都特別煩xml,但是有沒有什么好的辦法。最近有空看了下資料,springmvc早已經(jīng)出了零配置xml構(gòu)建工程方法。在網(wǎng)上找了下資料,發(fā)現(xiàn)挺簡單,自己動手來玩玩下。
??? 需要用的技術(shù) spring 5 mvc做web mvc框架,spring5 data jpa 做持久層,druid做連接池依賴,fastjson做jsonMessageConverter。
?? 項目用maven構(gòu)建 pom.xml依賴如圖:



? 配置DispatcherServlet
??? 隨著Servlet 3.0規(guī)范的發(fā)布,可以用幾乎沒有xml來配置你的Servlet容器。為此ServletContainerInitializer,在Servlet規(guī)范中有。在這個類中,你可以注冊過濾器,監(jiān)聽器,servlet等,就像你在傳統(tǒng)上做的那樣web.xml。
??? Spring提供了SpringServletContainerInitializer知道如何處理WebApplicationInitializer類的東西。AbstractAnnotationConfigDispatcherServletInitializer類實現(xiàn)WebMvcConfigurer內(nèi)部實現(xiàn)WebApplicationInitializer。它注冊一個ContextLoaderlistener(可選的)和一個,DispatcherServlet并允許您輕松地添加配置類來加載這兩個類,并將過濾器應(yīng)用于DispatcherServlet和提供servlet映射。
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
???????????? @Override
??????????? protected Class[] getRootConfigClasses() {
? ? ? ? ? ? ??? return new Class[] { AppConfig.class};
}
???????????????? @Override
???? protected Class[] getServletConfigClasses() {
????????? // TODO Auto-generated method stub
???????????? return new Class[] {WebMvcConfig.class};
}
??? @Override
? protected String[] getServletMappings() {
???????????? // TODO Auto-generated method stub
???????????????????????? return new String[] {"/"};
}
???????????????? @Override
public void onStartup(ServletContext? servletContext)throws? ServletException{?????????????????
super.onStartup(servletContext);
CharacterEncodingFilter chEncodingFilter = new CharacterEncodingFilter();
Dynamic dynamic = servletContext.addFilter("chEncodingFilter",chEncodingFilter);
dynamic.setInitParameter("encoding", "UTF-8");????????
dynamic.setInitParameter("forceEncoding","true");????????
???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? dynamic.addMappingForUrlPatterns(null, false, "/*");
//添加阿里云druid的數(shù)據(jù)庫監(jiān)控
StatViewServlet statViewServlet = new StatViewServlet();
javax.servlet.ServletRegistration.Dynamic servlet = servletContext.addServlet("statViewServlet", statViewServlet); servlet.addMapping("/druid/*");
}
Spring WebMVC配置
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.ting.spring.core", useDefaultFilters = false, includeFilters = @Filter(type = FilterType.ANNOTATION, value = { Controller.class }))
public class WebMvcConfig implements WebMvcConfigurer {
/** * 設(shè)置mvc 前綴 后綴 * * @return */
@Bean
public InternalResourceViewResolver resolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/view/");
resolver.setSuffix(".jsp");
return resolver;
}
/** * 設(shè)置配置文件的前綴 * * @return */
public MessageSource messageSource() {
ResourceBundleMessageSource source = new ResourceBundleMessageSource();
source.setBasename("applicationContext");
return source;
}
/* * @Override public Validator getValidator() {
LocalValidatorFactoryBean * factoryBean = new LocalValidatorFactoryBean();
return factoryBean; } */
@Bean
public FastJsonHttpMessageConverter converter() {
FastJsonHttpMessageConverter jsonMessageConverter = new FastJsonHttpMessageConverter();
jsonMessageConverter.setDateFormat("yyyy-MM-dd hh:mm:ss");
jsonMessageConverter.setFeatures(SerializerFeature.WriteMapNullValue,
SerializerFeature.WriteNullNumberAsZero,
SerializerFeature.WriteNullStringAsEmpty,
SerializerFeature.WriteNullStringAsEmpty,
SerializerFeature.WriteDateUseDateFormat);
List supportedMediaTypes = new ArrayList(); supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
supportedMediaTypes.add(MediaType.TEXT_PLAIN);
jsonMessageConverter.setSupportedMediaTypes(supportedMediaTypes);
return jsonMessageConverter;
}
/** * 添加靜態(tài)資源映射 */
@Override public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**", "/js/**", "/css/**"); }
@Bean public DemoInterceptor initIntercepter() {
???????????????? return new DemoInterceptor();
}
@Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(initIntercepter());
}
//主要這一步是必須的,不然會出現(xiàn)類型轉(zhuǎn)換。。
@Override
public void configureMessageConverters(List> converters) {
converters.add(converter());
}
}
spring data jpa配置
@EnableTransactionManagement
@Configuration
@PropertySource("classpath:applicationContext.properties") @ComponentScan(basePackages = "com.ting.spring.core", excludeFilters = { @Filter(value = {EnableWebMvc.class,Controller.class}) }) @EnableJpaRepositories(basePackages = "com.ting.spring.core.dao",entityManagerFactoryRef= "emf")
public class AppConfig {
@Autowired
private Environment env;
@Bean(name = "emf")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() { LocalContainerEntityManagerFactoryBean bean = new LocalContainerEntityManagerFactoryBean();
bean.setDataSource(getDataSource()); bean.setPackagesToScan("com.ting.spring.core.model");
JpaVendorAdapter adapter = new HibernateJpaVendorAdapter(); bean.setJpaVendorAdapter(adapter);
bean.setJpaProperties(createProp());
return bean;
}
@Bean
public DataSource getDataSource() {
//DriverManagerDataSource dataSource = new DriverManagerDataSource();
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUsername(env.getProperty("jdbc.mysql.username"));
dataSource.setUrl(env.getProperty("jdbc.mysql.url"));
dataSource.setPassword(env.getProperty("jdbc.mysql.password"));
dataSource.setDriverClassName(env.getProperty("jdbc.mysql.driver"));
dataSource.setMaxActive(Integer.parseInt(String.valueOf(env.getProperty("jdbc.maxActive"))));
dataSource.setInitialSize(env.getProperty("jdbc.initialSize", Integer.class));
dataSource.setMaxWait(env.getProperty("jdbc.maxWait", Integer.class));
dataSource.setMinIdle(env.getProperty("jdbc.minIdle", Integer.class));
dataSource.setMaxIdle(env.getProperty("jdbc.maxIdle", Integer.class));
dataSource.setTimeBetweenEvictionRunsMillis(env.getProperty("jdbc.timeBetweenEvictionRunsMillis", Long.class)); try {
dataSource.setFilters(env.getProperty("jdbc.filters"));
} catch (SQLException e) {
// TODO Auto-generated catch block e.printStackTrace();
} return dataSource;
}
@Bean public PlatformTransactionManager transactionManager(EntityManagerFactory enFactory) {
JpaTransactionManager jManager = new JpaTransactionManager();
jManager.setEntityManagerFactory(enFactory); return jManager;
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionProcessor() {
return new PersistenceExceptionTranslationPostProcessor();
}
public Properties createProp() {
Properties properties = new Properties(); properties.setProperty("hibernate.show_sql", "true");
properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
return properties;
}
}
實體類
@Entity
@Table(name = "user_info")
@ToString
@Data
public class UserInfo implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column(name = "user_name")
private String userName;
private Integer age;
private String phone;
private String sex;
private String email;
@Column(name = "create_time")
private Date ctime;
}
service層和Dao
@Service
public class UserInfoService {
@Autowired private UserInfoDao userDao;
public List findAll(){
return userDao.findAll();
}
}
@Repository
public interface UserInfoDao extends JpaRepository{ }
控制層
@Controller
public class IndexController {
@Autowired private UserInfoService userService;
private static Logger log = Logger.getLogger(IndexController.class); @GetMapping("/index")
public String index() {
log.info("hello 。。。。。");
return "index";
}
/**
?*服務(wù)器sse推送
*/
@GetMapping(value="/push",produces="text/event-stream;charset=UTF-8") @ResponseBody
public String push() throws Exception {
Random r = new Random();
Thread.sleep(2000);
return new String("data:\n\n".getBytes(),"utf-8"); }
@GetMapping("user/list")
@ResponseBody public Object findAll() {
return userService.findAll();
}
}
整個目錄架構(gòu)

一般都是周末才有時間發(fā)帖,平常下班也沒什么時間,一直都不是很清楚這個富文本框怎么用?如果有誰知道怎么讓代碼格式化更好看點,麻煩告訴我一聲,有時間我會發(fā)更多學(xué)習(xí)帖子和大家分享!最后分享一個我構(gòu)建工程主要參照帖子:spring5 example ?