springmvc02,使用注解
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
}
}
springmvc02,使用注解的更多相关文章
- springmvc-02(配置版与注解版区别)
首先,我们来看配置版和注解版的相同步骤: 1.新建一个Moudle , springmvc-02-hello , 添加web的支持! 2.确定导入了SpringMVC 的依赖! 3.配置web.xml ...
- SpringMVC案例2----基于spring2.5的注解实现
和上一篇一样,首先看一下项目结构和jar包 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVuamFtaW5fd2h4/font/5a6L5L2T/fo ...
- SpringMVC-02 第一个SpringMVC程序
SpringMVC-02 第一个SpringMVC程序 第一个SpringMVC程序 配置版 新建一个Moudle , springmvc-02-hello,确定依赖导入进去了 1.配置web.xml ...
- @RequestMapping注解的属性,将请求约束精细化
package com.atguigu.controller; import org.springframework.stereotype.Controller; import org.springf ...
- 基于spring注解AOP的异常处理
一.前言 项目刚刚开发的时候,并没有做好充足的准备.开发到一定程度的时候才会想到还有一些问题没有解决.就比如今天我要说的一个问题:异常的处理.写程序的时候一般都会通过try...catch...fin ...
- [Spring]IoC容器之进击的注解
先啰嗦两句: 第一次在博客园使用markdown编辑,感觉渲染样式差强人意,还是github的样式比较顺眼. 概述 Spring2.5 引入了注解. 于是,一个问题产生了:使用注解方式注入 JavaB ...
- Android注解使用之通过annotationProcessor注解生成代码实现自己的ButterKnife框架
前言: Annotation注解在Android的开发中的使用越来越普遍,例如EventBus.ButterKnife.Dagger2等,之前使用注解的时候需要利用反射机制势必影响到运行效率及性能,直 ...
- Android注解使用之注解编译android-apt如何切换到annotationProcessor
前言: 自从EventBus 3.x发布之后其通过注解预编译的方式解决了之前通过反射机制所引起的性能效率问题,其中注解预编译所采用的的就是android-apt的方式,不过最近Apt工具的作者宣布了不 ...
- spring注解源码分析--how does autowired works?
1. 背景 注解可以减少代码的开发量,spring提供了丰富的注解功能.我们可能会被问到,spring的注解到底是什么触发的呢?今天以spring最常使用的一个注解autowired来跟踪代码,进行d ...
随机推荐
- win32下使用相对exe文件的绝对路径资源
在使用VC++进行开发时,如果按F5进行Debug时,当前相对资源是相对工程的vcxproj的文件夹目录,而直接双击运行exe时,资源是相对exe的文件夹目录.为了兼容这二者,最好使用绝对路径,这样无 ...
- Nginx反向代理400错误
错误:使用Nginx的反向代理访问tomcat时400错误. upstream配置: upstream java_test{ server 127.0.0.1:8080; } 原因:nginx中ups ...
- P2P贷款全攻略,贷前、贷中、贷后工作事项解析
一.贷前调查事项 贷前调查是所有银行.小贷.P2P等等往出贷款部门的重中之重. 归根结底就是两条:让不对称信息最大限度对称.让软信息最大限度真实还原. 客户还不还款就是取决两大因素:还款能力.还款意愿 ...
- Docker入门 - 002 Docker 的简单操作
系统要求:CentOS 7.2 64 位操作系统. Docker 的简单操作 下载镜像 下载一个官方的 CentOS 镜像到本地 docker pull centos 下载好的镜像就会出现在镜像列表里 ...
- Ubuntu安装守护进程supervisor
Supervisor安装与配置(Linux/Unix进程管理工具) asp.net core 负载均衡集群搭建(centos7+nginx+supervisor+kestrel) 为了保证服务能够稳定 ...
- bootstrap-datepicker应用
参考本人的github:https://github.com/gmqllf/Datepicker-for-Bootstrap (fork官方的) 一.使用datepicker for bootstra ...
- Effective Java 第三版—— 86. 非常谨慎地实现SERIALIZABLE接口
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...
- 利用git 进行多人协作开发
现在,大部分项目都是用 git 来管理代码的,但当项目变大.多人协作时,git 的使用就变得复杂了,这时就需要在 git 使用的流程上来思考如何更优的使用 git. 对于大部分 web 项目而言,并不 ...
- .NET HttpGet 获取服务器文件下的图片信息 同步和异步方式处理
/// <summary> /// 项目文件夹下路径 返回流类型数据,如:图片类型 /// </summary> /// <returns></returns ...
- C# 操作PDF
Spire.PDF组件概述 Spire.PDF是一个专业的PDF组件,用于在.NET应用程序中创建,编辑,处理和阅读PDF文档.支持丰富的PDF文档处理操作,如PDF文档合并/拆分.转换(如HTML转 ...