• springmvc使用和经验总结(长沙师说网络科技有限公司)


    springmvc

    先分析下代码,高速学习。先要把配置文件写好,

    给上2个类详细看看

    package com.shishuo.studio.action;
    
    import org.apache.log4j.Logger;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.ModelMap;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
    
    import com.shishuo.studio.constant.SystemConstant;
    import com.shishuo.studio.entity.Category;
    import com.shishuo.studio.entity.vo.CourseVo;
    import com.shishuo.studio.entity.vo.PageVo;
    import com.shishuo.studio.exception.CategoryNotFoundException;
    import com.shishuo.studio.exception.notfound.StorageNotFoundException;
    import com.shishuo.studio.service.CategoryService;
    import com.shishuo.studio.service.UserService;
    
    /**
     * @author Herbert
     * 
     */
    @Controller
    @RequestMapping("/category")
    public class CategoryAction extends BaseAction {
    
    	protected final Logger logger = Logger.getLogger(this.getClass());
    
    	@Autowired
    	protected CategoryService categoryService;
    
    	@Autowired
    	protected UserService userService;
    
    	/**
    	 * 首页
    	 * 
    	 * @param modelMap
    	 * @return
    	 */
    	@RequestMapping(value = "/{categoryId}.htm", method = RequestMethod.GET)
    	public String category(@PathVariable long categoryId, ModelMap modelMap,
    			@RequestParam(value = "p", defaultValue = "1") int p) {
    		try {
    			// 获得数据
    			Category category = categoryService.getCategoryById(categoryId);
    			// 获取当前文件夹下的全部课程
    			PageVo<CourseVo> coursePageVo = courseService
    					.getCoursePageByIdForUser(categoryId, p, 24);
    			// 添加属性
    			modelMap.addAttribute("category", category);
    			modelMap.put("coursePageVo", coursePageVo);
    			return "category";
    		} catch (CategoryNotFoundException e) {
    			return SystemConstant.PAGE_404;
    		} catch (StorageNotFoundException e) {
    			// TODO Auto-generated catch block
    			return SystemConstant.PAGE_404;
    		}
    
    	}
    }
    

    package com.shishuo.studio.action;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.ModelMap;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    
    import com.shishuo.studio.action.auth.AuthBaseAction;
    
    @Controller
    @RequestMapping("/about")
    public class AboutAction extends AuthBaseAction {
    
    	/**
    	 * 跳转到关于我们页面
    	 * 
    	 * @param modelMap
    	 * @param request
    	 * @return
    	 */
    	@RequestMapping(value = "/about.htm", method = RequestMethod.GET)
    	public String about(ModelMap modelMap, HttpServletRequest request) {
    		return "/about/about";
    	}
    
    	/**
    	 * 跳转到服务协议页面
    	 * 
    	 * @param modelMap
    	 * @param request
    	 * @return
    	 */
    	@RequestMapping(value = "/service.htm", method = RequestMethod.GET)
    	public String service(ModelMap modelMap, HttpServletRequest request) {
    		return "/about/service";
    	}
    
    	/**
    	 * 跳转到投诉举报页面
    	 * 
    	 * @param modelMap
    	 * @param request
    	 * @return
    	 */
    	@RequestMapping(value = "/complain.htm", method = RequestMethod.GET)
    	public String complain(ModelMap modelMap, HttpServletRequest request) {
    		return "/about/complain";
    	}
    
    	/**
    	 * 跳转到版权声明页面
    	 * 
    	 * @param modelMap
    	 * @param request
    	 * @return
    	 */
    	@RequestMapping(value = "/copyright.htm", method = RequestMethod.GET)
    	public String copyright(ModelMap modelMap, HttpServletRequest request) {
    		return "/about/copyright";
    	}
    
    	/**
    	 * 跳转到联系我们页面
    	 * 
    	 * @param modelMap
    	 * @param request
    	 * @return
    	 */
    	@RequestMapping(value = "/connect.htm", method = RequestMethod.GET)
    	public String connect(ModelMap modelMap, HttpServletRequest request) {
    		return "/about/connect";
    	}
    
    }
    

    return "system/comment/comment";后面不须要东西

    return "redirect:/admin/comment/page.htm";一般当我改变一个状态的时候 我须要还是显示在当前页面 就须要再进入Action 相当于再到数据库訪问一次把 我改变的数据同个pageVo 显示到页面


    spring的注解学习
    @RequestParam("description") String description,
    @PathVariable
    请求路径上有个id的变量值,能够通过@PathVariable来获取  @RequestMapping(value = "/page/{id}", method = RequestMethod.GET) 
    @autowired 自己主动配置 不须要写getter() setter()方法
    @Deprecated  过时
    @Repository 用在接口前面的类 比方ibits接口类的最前面
    @ResponseBody当控制器返回页面不是字符串的时候 比方返回一个json对象用这个注解
    @Controller控制器 加在控制器类的最前面
    @RequestMapping("/admin/file")
    放在类前面是这个路径下
    @RequestMapping(value = "/index.htm", method = RequestMethod.GET)假设这个注解放在方法的前面 表示上面那个路径的基础下然后再是这个路劲
    @RequestParam(value = "fileId", defaultValue = "1")当url传入參数的时候就能够拿到值
    比方@RequestMapping(value = "/update.htm", method = RequestMethod.GET)
    public String update(
    @RequestParam(value = "fileId", defaultValue = "1") long fileId,
    ModelMap modelMap) throws Exception {}


    相关配置文件例如以下
    复制spring相关jar包到web-inf/lib里面
    然后在web.xml增加
    相当于springmvc的servlet
    <servlet>
    		<servlet-name>spring</servlet-name>
    		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    		<init-param>
    			<param-name>contextConfigLocation</param-name>
    			<param-value>classpath:applicationContext.xml</param-value>
    		</init-param>
    		<load-on-startup>1</load-on-startup>
    	</servlet>
    
    	<servlet-mapping>
    		<servlet-name>spring</servlet-name>
    		<url-pattern>*.htm</url-pattern>
    	</servlet-mapping>
    
    	<servlet-mapping>
    		<servlet-name>spring</servlet-name>
    		<url-pattern>*.json</url-pattern>
    	</servlet-mapping>
    然后在application.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:tx="http://www.springframework.org/schema/tx"
    	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
    	xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:task="http://www.springframework.org/schema/task"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans
    	         http://www.springframework.org/schema/beans/spring-beans.xsd     
    	         http://www.springframework.org/schema/tx   
    	         http://www.springframework.org/schema/tx/spring-tx.xsd    
    	         http://www.springframework.org/schema/aop     
    	         http://www.springframework.org/schema/aop/spring-aop.xsd    
    	         http://www.springframework.org/schema/mvc     
    	         http://www.springframework.org/schema/mvc/spring-mvc.xsd   
    	         http://www.springframework.org/schema/context     
    	         http://www.springframework.org/schema/context/spring-context.xsd
    	         http://www.springframework.org/schema/task 
    	         http://www.springframework.org/schema/task/spring-task.xsd">
    
    
    	<!-- 自己主动扫描的包名 -->
    	<context:component-scan base-package="com.shishuo.studio"></context:component-scan>
    
    
    	<mvc:annotation-driven />
    
    	<task:annotation-driven />
    	<tx:annotation-driven />
    
    	<bean
    		class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
    	<bean
    		class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
    	<mvc:interceptors>
    		<mvc:interceptor>
    			<mvc:mapping path="/**" />
    			<bean class="com.shishuo.studio.filter.GlobalInterceptor"></bean>
    		</mvc:interceptor>
    		<mvc:interceptor>
    			<mvc:mapping path="/auth/**" />
    			<bean class="com.shishuo.studio.filter.AuthInterceptor"></bean>
    		</mvc:interceptor>
    		<mvc:interceptor>
    			<mvc:mapping path="/auth/studio/**" />
    			<bean class="com.shishuo.studio.filter.StudioInterceptor"></bean>
    		</mvc:interceptor>
    	</mvc:interceptors>
    	<!-- 在XML配置文件里增加外部属性文件,当然也能够指定外部文件的编码 -->
    	<bean id="propertyConfigurer" class="com.shishuo.studio.util.PropertyUtils">
    		<property name="locations">
    			<list>
    				<value>classpath:shishuo.studio.properties</value> <!-- 指定外部文件的编码 -->
    			</list>
    		</property>
    	</bean>
    	<!-- FreeMarker的配置 -->
    	<bean id="freeMarkerConfigurer"
    		class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
    		<property name="templateLoaderPath" value="/WEB-INF/ftl" /><!-- 
    			指定路径 -->
    		<property name="defaultEncoding" value="UTF-8" /><!-- 指定编码格式 -->
    		<property name="freemarkerSettings">
    			<props>
    				<prop key="template_update_delay">10</prop>
    				<prop key="defaultEncoding">UTF-8</prop>
    				<prop key="url_escaping_charset">UTF-8</prop>
    				<prop key="locale">zh_CN</prop>
    				<prop key="boolean_format">true,false</prop>
    				<prop key="time_format">HH:mm:ss</prop>
    				<prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
    				<prop key="date_format">yyyy-MM-dd</prop>
    				<prop key="number_format">#.##</prop>
    				<prop key="whitespace_stripping">true</prop>
    				<prop key="classic_compatible">true</prop>
    			</props>
    		</property>
    	</bean>
    	<!-- 配置 FreeMarker视图解析器 -->
    	<bean id="viewResolver"
    		class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
    		<property name="viewClass"
    			value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"></property>
    		<property name="cache" value="false" />
    		<property name="prefix" value="/" />
    		<property name="suffix" value=".ftl" /><!--可为空,方便实现自已的根据扩展名来选择视图解释类的逻辑 -->
    		<property name="contentType" value="text/html;charset=utf-8" />
    		<property name="exposeRequestAttributes" value="true" />
    		<property name="exposeSessionAttributes" value="true" />
    		<property name="exposeSpringMacroHelpers" value="true" />
    	</bean>
    </beans>



    @Component,@Service,@Controller,@Repository注解的类,并把这些类纳入进spring容器中管理。

    它的作用和在xml文件里使用bean节点配置组件时一样的。
    @Component  Component是Spring管理组件的通用形式,而@repository,@Service,@Controller是它的细化。分别表示更加详细的用例(分别相应持久化层,服务层和表现层)


    B、依照Class路径扫描
    XML风格的配置方式。我们会在配置文件里配置大量的bean。这样但项目足够大时,那么这个配置文件将过于庞大而不便管理。而应用@凝视的配置方式。我们在类中用@Component等凝视类,并让容器依照Classpath自己主动扫描管理它们。要实现以上功能我们须要这样定义。
    <?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"
        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">
        <context:component-scan base-package="org.example" />
    </beans>
    在使用组件扫描时,AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor也将隐式包括进来,也就是说它支持@Autowired等,不须要我们如用<context:annotation-config/>再做声明了。。
    自己主动扫描包名的配置 <context:component-scan base-package="com.shishuo"></context>


    当我们用spring mvc 前端控制器的时候须要配置


    <!-- spring mvc 基于注解在方法上 控制映射 配置 -->
    <bean
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
    <bean
    class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    </bean>


    <!-- 在XML配置文件里增加外部属性文件。当然也能够指定外部文件的编码 -->
    <bean id="propertyConfigurer"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
    <list>
    <value>classpath:shishuocms.properties</value> <!-- 指定外部文件的编码 -->
    </list>
    </property>
    </bean>


    <!-- 配置 FreeMarker视图解析器 -->
    <bean id="viewResolver"
    class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
    <property name="viewClass"
    value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"></property>
    <property name="cache" value="false" />
    <property name="prefix" value="/" />
    <property name="suffix" value=".ftl" /><!--可为空,方便实现自已的根据扩展名来选择视图解释类的逻辑 -->
    <property name="contentType" value="text/html;charset=utf-8" />
    <property name="exposeRequestAttributes" value="true" />
    <property name="exposeSessionAttributes" value="true" />
    <property name="exposeSpringMacroHelpers" value="true" />
    </bean>


    <!--创建数据映射器。数据映射器必须为接口 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="annotationClass" value="org.springframework.stereotype.Repository" />
    <property name="basePackage" value="com.shishuo.cms.dao" />
    </bean>
    spring mvc 拦截器


    拦截器在application.xml配置


    <mvc:interceptors>
    <mvc:interceptor>
    <mvc:mapping path="/**" />
    <bean class="com.shishuo.cms.filter.GlobalInterceptor"></bean>
    </mvc:interceptor>
    </mvc:interceptors>


    怎么使用RequestMapping的參数 主要有RequestParam Pathvariable(这个注解是获取url里面的參数)


    5.1.1、常见应用场景
    1、日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等。
    2、权限检查:如登录检測。进入处理器检測检測是否登录,假设没有直接返回到登录页面。
    3、性能监控:有时候系统在某段时间莫名其妙的慢。能够通过拦截器在进入处理器之前记录開始时间。在处理完后记录结束时间。从而得到该请求的处理时间(假设有反向代理。如apache能够自己主动记录);
    4、通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便兴许流程使用,还有如提取Locale、Theme信息等,仅仅要是多个处理器都须要的就可以使用拦截器实现。
    5、OpenSessionInView:如Hibernate,在进入处理器打开Session,在完毕后关闭Session。
    …………本质也是AOP(面向切面编程),也就是说符合横切关注点的全部功能都能够放入拦截器实现。




    MySQL server version for the right syntax to use near  where userId=28  at line 1
    这个错误是在写改动语句的时候 where 前面多加了一个逗号 
    syntax error 是语法错误
     
    Could not resolve view with name 'auth/teacher/skill/update' in servlet with是自己没有加@Responsebody 用spring mvc 的时候返回是json 一定要记得写@Responsebody


    当须要上传一个form里面包括 文件 或者视屏的时候 一定要记得在form表单后面加入 enctype="multipart/form-data" enctype="multipart/form-data"


     @RequestParam @RequestBody @PathVariable 等參数绑定注解具体解释
    分类: spring 2012-09-21 16:22 11494人阅读 评论(4) 收藏 举报
    文件夹(?

    )[+]
    引言:
    接上一篇文章。对@RequestMapping进行地址映射解说之后。该篇主要解说request 数据到handler method 參数数据的绑定所用到的注解和什么情形下使用;




    简单介绍:
    handler method 參数绑定经常使用的注解,我们依据他们处理的Request的不同内容部分分为四类:(主要解说经常使用类型)


    A、处理requet uri 部分(这里指uri template中variable,不含queryString部分)的注解:   @PathVariable;
    B、处理request header部分的注解:   @RequestHeader, @CookieValue;
    C、处理request body部分的注解:@RequestParam,  @RequestBody;


    D、处理attribute类型是注解: @SessionAttributes, @ModelAttribute;



  • 相关阅读:
    Spring基础知识点总结
    秒懂设计模式--代理模式(proxy)
    秒懂设计模式--工厂模式
    秒懂设计模式--适配器模式
    秒懂设计模式--装饰者模式
    秒懂设计模式--观察者模式
    单例模式的几种实现
    springboot2.0+spring cloud+eureka搭建微服务步骤
    字符串排序算法
    bitbucket的简单使用
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7357980.html
Copyright © 2020-2023  润新知