薛磊 Job Seeker

SpringMVC

2019-06-17

六、SpringMVC

1.WEB.xml

<!-- 1.注册监听器,监听服务器的启动,在启动时,自动加载spring相关的xml文件 -->
<listener>
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
	<param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value><!--配置service及以下 -->
</context-param>
<!-- 2.配置SpringMVC入口servlet,所有*.form请求,都会进入spring中 -->
<!-- 并在服务器启动时,默认加载位于web.inf文件夹中的viewSpace.xml,以配置springMVC -->
<!-- 配置service以上 -->
<servlet>
	<servlet-name>viewSpace</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup> <!-- 设置此选项后,servlet会在服务器一启动就创建-->
</servlet>
<servlet-mapping>
	<servlet-name>viewSpace</servlet-name>
    <url-pattern>*.form</url-pattern>
  	<url-pattern>*.css</url-pattern>
  	<url-pattern>*.jpg</url-pattern>
  	<url-pattern>*.js</url-pattern>
  	<url-pattern>*.png</url-pattern>
</servlet-mapping>
<!-- 3.配置字符集过滤器,解决中文乱码问题 -->
<filter>
	<filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
	<filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

2.viewSpace-servlet.xml

<!-- controller及以上,在此处配置 -->
<!-- 开启扫描注解,指定要扫描的包,多个包的话,名字之间可以用逗号隔开,防止多次扫描,因为application也里也有扫描,该配置文件只扫描controller及以上-->
<context:component-scan base-package="cn.dlian">
    <context:exclude-filter type="annotation" expression="org.springframwork.stereotype.Service" />
    <context:exclude-filter type="annotation" expression="org.springframwork.stereotype.Repository" />	
</context:component-scan>
<!-- 开启此选项,才能在重定向时使用RedirectAttributes -->
<mvc:annotation-driven />

<!-- 开启validator校验器进行字段校验 -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />

<!-- 给Controller注入Service -->
<bean id="userInfoController" class="cn.dlian.controllers.UserInfoController"
      p:userInfoService-ref="userInfoService"
/>

<!-- 屏蔽Repository和Service扫描 -->
<context:component-scan base-package="cn.dlian">
		<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />
    	<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository" />	
</context:component-scan>

<!--配置拦截器 -->
<mvc:interceptors>
	<mvc:interceptor>
    	<mvc:mapping path="../**/*.form" /> <!--拦截器映射-->
        <mvc:exclude-mapping path="/**/login.form" /> <!--不包含的请求映射(不拦截) -->
        <mvc:exclude-mapping path="/**/index.form" />
        <bean class="cn.dlian.interceptors.LoginInterceptor" /> <!--处理拦截事务的拦截器类-->
    </mvc:interceptor>
</mvc:interceptors>

<!-- 外部访问资源文件,需要对路径进行映射 -->
<mvc:resources location="WEB-INF/css/" mapping="/css/**"/>
<mvc:resources location="WEB-INF/js/" mapping="/js/**"/>
<mvc:resources location="WEB-INF/img/" mapping="/img/**"/>
<mvc:resources location="WEB-INF/fonts/" mapping="/fonts/**"/>
<mvc:resources location="WEB-INF/plugins/" mapping="/plugins/**"/>
<mvc:resources location="WEB-INF/ajax/" mapping="/ajax/**"/>

3.Controller

//一、传递普通参数
@Controller("parController")//给该注解别名,其他地方调用的对象名就为parController
@RequestMapping("/")
public class ParamController{
    @RequestMapping("otherPage")
    public String jumpOtherPage(){
		System.out.println("第一个请求!");
        return "otherPage.jsp";
        //return "redirect:otherPage.jsp";
    }
    @RequestMapping("sendParam")
    public String sendParam(@RequestParam(value="username",required=false) String userName,@Reqeust("password") String userPass){
        System.out.println("账号"+userName);
        System.out.println("密码"+userPass);
        return "showParam.jsp";
    }
    @RequestMapping("sendParamWithRequest")
    public String sendParamWithRequest(@RequestParam("username") String userName,@Reqeust("password") String userPass,HttpServletRequest request){
        System.out.println("账号"+userName);
        System.out.println("密码"+userPass);
        
        request.setAttribute("userName",userName);
        return "showParam.jsp";
    }
    @RequestMapping("sendSameNameWithRequest")
    public String sendSameNameWithRequest(@RequestParam String username,@Reqeust String password,HttpServletRequest request){
        System.out.println("账号"+username);
        System.out.println("密码"+password);
        
        request.setAttribute("userName",username);
        return "showParam.jsp";
    }
    @RequestMapping("sendSameNameWithRequestRedirect")
    public String sendSameNameWithRequest(@RequestParam String username,@Reqeust String password) throws UnsupportedEncodingException{
        return "redirect:showParam.jsp?username="+URLEncoder.encode(username,"utf-8")+"&password="+password;
    }
    
    @RequestMapping("sendSameNameWithRequestRedirectSpring")
    public String sendSameNameWithRequestRedirectSpring(@RequestParam String username,@Reqeust String password,Redirect attrs) throws UnsupportedEncodingException{
        attrs.addAttribute("username",username);
        attrs.addAttribute("password",passwrod);
        return "redirect:showParam.jsp"	;
    }
}
//路径参数
@Controller
@RequestMapping("/")
public class PathVariableController{
    //getPage3By100Items
    @Request String multiPageQuery(@PathVariable int pageNo,@PageVariable int countPage){
        System.out.println(pageNo+" "+countPage);
        return "otherPage.jsp";
    }
}
//三、传递表单数据到实体对象中(模型属性)
@Controller
@RequestMapping("/")
public class UserController{
    @ReqeustMapping(value="login",method={RequestMethod.POST})
    public String login(@ModelAttribute("user") User pUser){
        //模型属性会自动放入reqeust中
    }
}
//四、控制器跳转至另一个控制器
//转发
return "sendSameNameParamWithRequest.form";
//重定向利用RedirectAttributes attrs

4.字段校验

hibernate-validator-x.jar

jboss-logging-x.jar

validation-api-x.jar

public class User{
    @Pattern(regexp="^\\S{3,16}$",message="账号名必须是3-16位的非空白字符!")
    private String username;
    @NotNull(message="此字段不能为null!")
    @NotEmpty(message="此字段不能为空!")
    @Length(min=3,max=16,message="密码必须是3-16位!")
    priavte String password;
}

@Controller
@ReqeustMapping("/")
public class UserControlelr{
    @RequestMapping("login")
    public String login(@Valid @ModelAttribute User user,BindingResult bindingResult){
        //BindingResult存放出错信息
        //首先判断字段校验是否通过,若未通过,则不需要进行登陆验证!
        if(bindingResult.hasErrors()){
            return "index.jsp";
		}
        //登陆验证
        if("zhangsan".equals(user.getUserName())&&"123456".equals(user.getUserpass())){
            return "loginSuccess.jsp";
        }
        return "loginFailed.jsp";
    }
}

5.ModelAndView

@Controller
@RequestMapping("/")
public class UserController{
    @RequestMapping("login")
    public ModelAndView login(@ModelAttribute User user){
        ModelAndView mav = new ModelAndView("index.jsp");
        mav.addObject("otherInfo","呵呵");
        return mav;
    }
}

6.注解

@Repository Dao层

@Service Service层

@Controller

@Autowired 变量

@Qualifier(“userInfoDao”) 跟在auto下面,只有匹配名字的bean才能注入进来

@ResponseBody 添加此注解,表示返回的字符串不是页面地址,而是响应体正文

7.application.xml

去掉bean
<!-- 在application.xml里屏蔽controller扫描
	 在viewSpace-servlet.xml里屏蔽Repository和Service扫描
<!-- application和viewSpace都需要打开扫描注解 -->
<context:component-scan base-package="cn.dlian">
    <context:exclude-filter type="annotation" expression="org.springframwork.stereotype.Controller" />
</context:component-scan>

8.自动生成实体类使用

<!-- 下面添加一个bean的设置,使其能够扫描myBatis的Dao层接口,自动生成实体类使用 -->
<!-- applicationContext.xml -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfiger"
      p:basePackage="cn.dlian.dao"
/>

9.HandlerInterceptor接口

public class LoginInterceptor implements HandlerInterceptor{
    //请求执行之后,再执行的方法,一般在此处清理释放资源
    public void afterCompletion(HttpServletRequest req,HttpServletResponse resp,Object obj,Exception exc) throws Exception{}
    
    //正在执行请求,准备跳转页面之前执行的方法,一般在此处我们可以处理一部分请求或添加一部分响应头等
    public void postHandle(HttpServletRequest req,HttpServletResponse resp,Object obj,ModelAndView mav) throws Exception{}
    
    //正在执行请求,准备跳转页面之前执行的方法,一般在此处我们可以处理一部分请求或添加一部分响应头等
    public boolean preHandle(HttpServletRequest req,HttpServletResponse resp,Object obj) throws Exception{
        User user = req.getSession().getAttribute("loginUser");
        if(user==null){
            req.sendRedirect("index.jsp");
            return false;	//阻止继续向下传递请求
        }
        return true; //放行
    }
    
}

HTTP请求处理流程-SpringMvc

在SpringMVC的http请求处理过程中,包括了前端控制器(DispatcherServlet)、处理映射器(HandlerMapping)、处理适配器(HandlerAdapter)、处理器((Handler)Controller)、视图解析器(ViewReslover)、视图(View)这六大主要对象。他们负责对http请求做处理。

第一步:前端控制器dispatcher接受请求

Client—url—>Dispatcher

第二步:前端控制器去发起handler映射查找请求

Dispatcher—HttpServletRequest—> HandlerMapping

第三步:处理器映射器查找hanlder并返回HandlerExetuionChain

Dispatcher <—HandlerExeutionChain—HandlerMapping

第四步:前端控制器发起请求处理器适配器请求执行

Dispatcher—Handler—> HandlerAdapter

第五步:处理器适配器去调用handler执行

HandlerAdapter—HttpServletRequest> Handler(Controller)

第六步:处理器处理后返回ModelAndView给HandlerAdapter

HandlerAdapter <—ModelAndView—Handler(Controller)

第七步:处理器适配器将ModelAndView返回给前端控制器

Dispatcher <—ModelAndView—HandlerAdapter

第八步:前端控制器请求视图解析器解析ModelAndView

Dispatcher—ModelAndView—> ViewReslover

第九步:视图解析器解析视图后返回视图View给前端控制器

Dispatcher <—View—ViewReslover

第十步:前端控制器请求视图要求渲染视图

Dispatcher—>View—>render

第十一步:前端控制器返回响应

Response <—Dispatcher


下一篇 操作系统

Comments

Content