unit04_01

a.RequestMappingHandlerMapping组件

@RequestMapping("/login.do")

该标记用在Controller业务方法前

b.Controller编写和配置

取消了实现Controller接口及方法的约定,可以允许程序猿按需要灵活定义业务方法.

Controller需要扫描到Spring容器,必须使用@Controller

public ModelAndView或者String 方法名(根据需要定义request,session,response)

例子:

public String execute(){

  return "hello";

}

public ModelAndView execute(){

  ModelAndView mav=new ModelAndView();

  mav.getModel().put("msg", "模型数据");//等价于request.setAttribute("msg","data");

  return "hello";

}

流程:

-->DispatcherServlet

-->HandlerMapping

-->HelloController

-->ViewResolver

-->hello.jsp

完整代码:

spring xml:

<mvc:annotation-driven/>

<!-- 扫描controller -->

<context:component-scan base-package="org.alexhe"></context:component-scan>

<!-- 配置viewResolver -->

<bean id="viewresolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="prefix" value="/WEB-INF/"></property>

<property name="suffix" value=".jsp"></property>

</bean>

web.xml:

<servlet>

<servlet-name>springmvc</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>springmvc</servlet-name>

<url-pattern>*.do</url-pattern>

</servlet-mapping>

HelloController.java:

package org.alexhe.controller;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.servlet.ModelAndView;

@Controller

public class HelloController {

@RequestMapping("/hello.do")

public ModelAndView execute(){

ModelAndView mav=new ModelAndView();

mav.setViewName("hello");

mav.getModel().put("msg", "我是一个msg");

return mav;

}

}

hello.jsp:

<h2>springmvc注解版,${msg}</h2>


unit04_02

进入登陆页面

/tologin.do

-->DispatcherServlet

-->Handlermapping

-->Logincontroller.toLogin

-->ViewResolver

-->login.jsp

/login.do

-->DispatcherServlet

-->Handlermapping

-->Logincontroller.checkLogin

-->ViewResolver

-->错误login.jsp,正确ok.jsp

完整代码:

login.jsp:

<form action="login.do" method="post">

用户名:<input type="text" name="username"><br>

密码:<input type="password" name="password"><br>

<input type="submit" value="登陆">

</form>

LoginController:

package org.alexhe.controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

@Controller

public class LoginController {

@RequestMapping("/tologin.do")

public String toLogin(){

return "login";//返回视图名称

}

@RequestMapping("/login.do")

public String checkLogin(HttpServletRequest request){

//获取请求信息

String name=request.getParameter("username");

String password=request.getParameter("password");

if("root".equals(name)&&"1234".equals(password)){

return "ok";

}else{

return "login";

}

}

}


1.如何接受请求参数

  a。利用HttpServletRequest

  b。利用业务方法参数

    --参数名与请求参数key保持一致,public String f1(String username,String password)

    --利用@RequestParam("key"),public String f1(@RequestParam("username")String name,@RequestParam("password")String pass)//前台jsp传过来的是username和password

  c。利用实体对象参数

使用建议:少量参数用b。大量参数用c。遇到非字符串类型参数建议使用a。

例子:

@RequestMapping("/login1.do")

public String checkLogin1(String username,String password){

System.out.println("执行checklong1方法");

System.out.println("username:"+username);

System.out.println("password:"+password);

return "login";

}

@RequestMapping("/login2.do")

public String checkLogin2(@RequestParam("username")String name,@RequestParam("password")String passw){

System.out.println("执行checklong2方法");

System.out.println("username:"+name);

System.out.println("password:"+pass);

return "login";

}

//测试用实体对象接收请求参数,前台jsp不需要像struts一样改成user.username。还是用username和password

@RequestMapping("/login2.do")

public String checkLogin2(User user){

System.out.println("执行checklong2方法");

System.out.println(user.getUsername());

return "login";

}

2.Controller如何向相应jsp传值

a。利用HttpServletRequest

b。利用ModelAndView做返回值

c。利用ModelMap方法参数

d。使用@ModelAttribute("key")

c的例子:

@RequestMapping("/login3.do")

public String checkLogin3(String username,String password,ModelMap model){

if("root".equals(username)&&"1234".equals(password)){

model.put("user", username);

return "ok";

}else{

model.put("msg","用户名密码错误");

return "login";

}

}

3.Controller如何使用Session

--

public String checkLogin(HttpServletRequest request){

}

或者干脆直接加HttpSession

public String checkLogin(HttpSession session){

}

例子:

@RequestMapping("/login3.do")

public String checkLogin3(String username,String password,ModelMap model,HttpSession session){

}


案例:列表显示功能 (unit0501 1:25:00)

/list.do

-->DispatcherServlet

-->Handlermapping

-->ListController,传递到list.jsp

-->ViewResolver

-->/WEB-INF/list.jsp


4如何解决中文接收乱码问题

mysql jdbc utf-8

request.setCharacterEncoding("utf-8");

filter拦截器里加request.setCharacterEncoding("utf-8");

filter例子:

web.xml里加:

<filter>

<filter-name>myfilter</filter-name>

<filter-class>org.alexhe.filter.MyFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>myfilter</filter-name>

<url-pattern>*.do</url-pattern>

</filter-mapping>

MyFilter类:

//每次的拦截方法

@Override

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

throws IOException, ServletException {

// TODO Auto-generated method stub

//前期逻辑会走

chain.doFilter(request, response);//调用servlet,放行

//后面的逻辑,也会走

}

除了上面这个方法,还有spring-webjar包里有很多filter,listener组件:

不用自己写myfilter类,并把web.xml改成:

<filter>

<filter-name>myfilter</filter-name>

<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

<init-param>

<param-name>encoding</param-name>

<param-value>UTF-8</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>myfilter</filter-name>

<url-pattern>*.do</url-pattern>

</filter-mapping>

如果get请求有中文,需要改tomcat的配置文件。

5.如何处理异常

测试类Controller,访问他肯定报空指针异常:

@Controller

public class ExceptionController1 {

@RequestMapping("/exception1.do")

public String ex1(){

String s =null;

s.length();

return "ok";

}

}

只要在applicationContext.xml加:这就是全局异常

<!-- 异常处理器 -->

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">

<property name="exceptionMappings">

<props>

<prop key="java.lang.Exception">error</prop>  <!-- 加上前缀后缀,找WEB-INF/error.jsp ,可以多加几个prop,针对不同异常指定不同的相应页面-->

</props>

</property>

</bean>

这样访问http://localhost:8080/dnspringmvc2/exception1.do就会跳到报错页面了

第二种方法:每个controller最好都加,执行该方法后,不会再调用ExceptionResolver

//局部当前Controller异常处理,只限于当前Controller出现异常

@ExceptionHandler

public String handleException(HttpServletRequest request,Exception e){

request.setAttribute("msg", "带出去的消息");

return "error";

}

第三种方法:常用于测试阶段,把异常集中写入文件。

spring的xml,需要注释第一种方法的全局简单异常:

<!-- 使用自定义ExceptionResolver -->

<bean class="org.alexhe.exception.MyExceptionHandler">

</bean>

MyExceptionHandler.java:

public class MyExceptionHandler implements HandlerExceptionResolver{

@Override

public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object arg2,

Exception e) {

// 把异常写入文件

System.out.println(e);

//返回错误页面

ModelAndView mav=new ModelAndView();

mav.setViewName("error");

return mav;

}

}

6.如何实现登录权限检查

使用session进行约定值判断。

实现方法:1.采用Filter。2.采用拦截器

a拦截器组件简介

拦截器是springmvc的组件

拦截器可以在Controller之前或者之后拦截;

也可以在jsp解析完毕给浏览器输出之前拦截。

b.拦截器的使用方法

首先编写一个拦截器组件(实现HandlerInterceptor),在约定方法中添加要插入的逻辑,然后在applicationContext.xml中配置一下。

spring.xml:

<!-- 配置拦截器 -->

<mvc:interceptors>

<mvc:interceptor>

<!-- 拦截哪些请求 -->

<mvc:mapping path="/tologin.do"/>

<mvc:mapping path="/tohello.do"/>

<!-- <mvc:mapping path="/**"/> 表示全都拦下 /*只拦一层 -->

<!-- 放过哪些请求 -->

<mvc:exclude-mapping path="/tologin.do"/>

<bean class="org.alexhe.interceptor.LoginInterceptor"></bean>

</mvc:interceptor>

</mvc:interceptors>

拦截器.java:

public class LoginInterceptor implements HandlerInterceptor {

//请求处理完毕,输出之前

public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)

throws Exception {

}

//Controller之后

public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)

throws Exception {

}

//请求处理之前,Controller之前

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {

//实现登陆检查

HttpSession session=request.getSession();

//获取登陆成功后放置的用户信息。

String name=(String)session.getAttribute("username");

if(name!=null){//登陆成功

return true;//继续执行mvc后续流程

}else{//未登陆

response.sendRedirect("toLogin.do");

return false;

}

//return false;//记得改成true

}

}

转载于:https://www.cnblogs.com/alexhjl/p/6828271.html

springmvc02,使用注解相关推荐

  1. SpringMVC框架 学习DAY_03:@RequestMapping注解/拦截器与过滤器

    1. 关于@RequestMapping注解 在控制器中,在处理请求的方法之前添加@RequestMapping注解,可以配置请求路径与处理请求的方法的映射关系! 在@RequestMapping注解 ...

  2. Java(SpringMVC02)

    Java(SpringMVC02) 参考视频:8. Controller配置总结(狂神) 6. 控制器Controller和Restful风格 6.1 控制器Controller 控制器复杂提供访问应 ...

  3. SpringMVC的常用注解(三)

    白发戴花君莫笑,岁月从不败美人. 愿,像你我一如既往地好看. 上一章简单介绍了SpringMVC的'两个蝴蝶飞,你好'的简单开发(二),如果没有看过,请观看上一章. 一. SpringMVC的常用注解 ...

  4. 在kotlin companion object中读取spring boot配置文件,静态类使用@Value注解配置

    在kotlin companion object中读取配置文件 静态类使用@Value注解配置 class Config {@Value("\${name}")fun setNam ...

  5. 使用feign调用注解在eureka上的微服务,简单学会微服务

    使用feign调用注解在eureka上的微服务. 首先,确保所有服务(调用方与被调用方)都被注册在同一个eureka服务上. 1. 在调用方添加依赖(万事第一步,加依赖) <dependency ...

  6. IDEA中根据数据库自动生成实体类,并自定义所生成的实体类中的注解 @Table @Id @...

    使用IDEA项目添加Hibernate扩展,生成实体类并配置实体类中的注解 一.使用Hibernate自动生成实体类 1.在项目上右键,选择Add Framework Support找到 Hibern ...

  7. @Transactional注解最容易忽视的三个失效场景!

    @Transactional注解在以下场景中使用,是会失效的,切记! 1.非public方法 spring对注解事务的方法进行校验,修饰符是不是public,不是 public则不会获取@Transa ...

  8. IDEA自动生成类注解,IDEA作者信息自动生成,IDEA类信息自动生成

    在新建类文件的时候自动生成注解,诸如我们常见的那些 作者,创建时间,TODO 等等 将以下格式的代码放在Settings -> File and Code Templates -> Inc ...

  9. mybatis使用注解开发

    mybatis使用注解开发 面向接口编程 在之前我们是通过面向对象编程,但是在真正开发的时候我们会选择面向接口编程. 根本原因 : 解耦 , 可拓展 , 提高复用 , 分层开发中 , 上层不用管具体的 ...

  10. 【Spring】spring基于注解的声明式事务控制

    结构 domin package com.itheima.domain;import java.io.Serializable;public class Account implements Seri ...

最新文章

  1. ios unrecognized selector sent to instance出现的原因和解决方案
  2. vim常用替换表达式
  3. Spring MVC集成Log4j
  4. 斐波那契数与二分法的递归与非递归算法及其复杂度分析
  5. 玩转Javascript 给JS写测试
  6. C++ 11 中的右值引用
  7. POJ1661 Help Jimmy(dp)
  8. js <->java 时区处理
  9. 如何使用powerdesigner导出sql脚本
  10. Android 数据库加密
  11. js给列表设置统一的高度
  12. oracle数据库if函数,Oracle NULLIF函数
  13. 论文笔记--用于人体姿势估计的深度双连续网络(Deep Dual Consecutive Network for Human Pose Estimation)
  14. CHM转换PDF好轻松
  15. thinkphp的column()函数
  16. 普乐蛙4d5d动感影院|VR太空旅行设备|VR带你遨游太空
  17. 用故事解析setTimeout和setInterval(内含js单线程和任务队列)
  18. 哈夫曼编码器和译码器(完整代码)
  19. item_search_img-按图搜索1688商品(拍立淘)接口的接入参数说明
  20. 用python编写一个猜年龄的小程序-知道了这个,你也能写出 Python 趣味小程序

热门文章

  1. SQL语句详解(三)——SQL子查询
  2. Linux SSHD服务安装与维护详解(一)——SSHD安装、启动与密钥认证实现
  3. 华三 h3c Smart linkMonitor link配置
  4. 蓝桥杯2011--2--歌赛新规则
  5. java - 常见对象object
  6. Java内存与垃圾回收调优
  7. 大幅提高Android开发效率之TemplateBuilder
  8. I.MX6 Parallel RGB LCD Datasheet描述
  9. 模板方法模式的房间改造-组合查询
  10. MongoDB基本管理命令 [转]