Unit04: 实战技巧 、 登录    

使用注解方式简化Unit04的小程序。

1. 基于注解的springmvc应用程序的开发

(1)编程步骤

step1. 导包。
step2. 添加spring配置文件。
step3. 配置DispatcherServlet。
step4. 写Controller。

a. 不用实现Controller接口了。
b. 可以添加多个方法。
c. 方法名不做要求,返回类型可以是ModelAndView,也可以String。
d. 使用@Controller注解。(不用配置bean了)。
e. 使用@RequestMapping注解。(不用配置HandlerMapping了)。

step5. 写jsp。
step6. 配置组件扫描和视图解析器。

(2)读取请求参数值

方式一 通过request对象

方式二 通过 @RequestParam注解

方式三 封装成javabean

step1. 写一个java类,要求见图示:

step2.在方法中,添加该javabean作为方法参数。

(3) 向页面传值

方式一 绑订数据到request对象

方式二 返回ModelAndView对象

方式三 利用ModelMap对象

方式四 绑订数据到session对象

(4) 重定向

情形一 如果方法的返回值是String

情形二 如果方法的返回值是ModelAndView

案例

src/main/java

controller

package controller;
/**
* 用于封装请求参数值的javabean。
*
*/
public class AdminParam {
private String adminCode;
private String pwd;
public String getAdminCode() {
return adminCode;
}
public void setAdminCode(String adminCode) {
this.adminCode = adminCode;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
} }

AdminParam.java

package controller;

import java.util.HashMap;
import java.util.Map; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession; import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.RedirectView; /**
* 处理器类
*
*/
@Controller
public class HelloController { @RequestMapping("/hello.do")
public String hello(){
System.out.println("hello()");
//返回视图名
return "hello";
} @RequestMapping("/toLogin.do")
public String toLogin(){
System.out.println("toLogin()");
return "login";
} @RequestMapping("/login.do")
/*
* DispatcherServlet在调用处理器方法
* 之前,会分析方法的结构(使用反射机制),
* 如果发现需要一个request对象,则
* DispatcherServlet会将request对象传递
* 进来。(了解)
*/
public String login(
HttpServletRequest request){
System.out.println("login()");
String adminCode =
request.getParameter("adminCode");
System.out.println("adminCode:"
+ adminCode);
return "index";
} @RequestMapping("/login2.do")
/**
* 建议在每一个形参前,都添加上@RequestParam。
*/
public String login2(
@RequestParam("adminCode")
String code,
String pwd){
System.out.println("login2()");
System.out.println("adminCode:"
+ code);
return "index";
} @RequestMapping("/login3.do")
public String login3(AdminParam ap){
System.out.println("login3()");
System.out.println("adminCode:"
+ ap.getAdminCode());
return "index";
} @RequestMapping("/login4.do")
public String login4(AdminParam ap,
HttpServletRequest request){
System.out.println("login4()");
System.out.println("adminCode:"
+ ap.getAdminCode());
//绑订数据到request对象
request.setAttribute("adminCode",
ap.getAdminCode());
//DispatcherServlet默认使用转发
return "index";
} @RequestMapping("/login5.do")
public ModelAndView login5(AdminParam ap){
System.out.println("login5()");
System.out.println("adminCode:"
+ ap.getAdminCode());
/*
* 将处理结果添加到ModelAndView对象里面。
* ModelAndView(String viewName,Map data)
*/
Map<String,Object> data =
new HashMap<String,Object>();
//相当于request.setAttribute(
//"adminCode",ap.getAdminCode());
data.put("adminCode",
ap.getAdminCode());
ModelAndView mav =
new ModelAndView("index",data);
return mav;
} @RequestMapping("/login6.do")
public String login6(AdminParam ap,
ModelMap mm){
System.out.println("login6()");
System.out.println("adminCode:"
+ ap.getAdminCode());
//将数据添加到ModelMap对象
//相当于执行了request.setAttribute
mm.addAttribute("adminCode",
ap.getAdminCode());
return "index";
} @RequestMapping("/login7.do")
public String login7(AdminParam ap,
HttpSession session){
System.out.println("login7()");
System.out.println("adminCode:"
+ ap.getAdminCode());
//绑订数据到session对象
session.setAttribute("adminCode",
ap.getAdminCode());
return "index";
} @RequestMapping("/login8.do")
public String login8(){
System.out.println("login8()");
return "redirect:toIndex.do";
} @RequestMapping("/login9.do")
public ModelAndView login9(){
System.out.println("login9()");
RedirectView rv =
new RedirectView("toIndex.do");
ModelAndView mav =
new ModelAndView(rv);
return mav;
} @RequestMapping("/toIndex.do")
public String toIndex(){
return "index";
} @RequestMapping("/toBmi.do")
public String toBmi(){
System.out.println("toBmi()");
return "bmi";
} @RequestMapping("/bmi.do")
public String bmi(
HttpServletRequest request){
System.out.println("bmi()");
String height =
request.getParameter("height");
String weight =
request.getParameter("weight");
double bmi =
Double.parseDouble(weight) /
Double.parseDouble(height)/
Double.parseDouble(height);
String status = "正常";
if(bmi < 19){
status = "过轻";
}
if(bmi > 25){
status = "过重";
}
request.setAttribute("status", status);
return "view";
} }

HelloController.java

src/main/resources

<?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"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd">
<!-- 配置组件扫描 -->
<context:component-scan
base-package="controller"/>
<!-- 配置视图解析器 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"/>
<property name="suffix" value=".jsp"/>
</bean> </beans>

spring-mvc.xml

WEB-INF

<%@ page
contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<html>
<head>
</head>
<body style="font-size:30px;">
<form action="bmi.do" method="post">
身高(米):<input name="height" /><br/>
体重(公斤):<input name="weight" /><br/><br/>
<input type="submit" value="确定"/>
</form> </body>
</html>

bmi.jsp

<h1>Hello,SpringMVC</h1>

hello.jsp

<h1>index</h1>
<h1>${adminCode}</h1>

index.jsp

<%@ page
contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<html>
<head>
</head>
<body style="font-size:30px;">
<form action="login9.do" method="post">
帐号:<input name="adminCode" /><br/>
密码:<input type="password"
name="pwd"/><br/>
<input type="submit" value="登录"/>
</form> </body>
</html>

login.jsp

<%@ page
contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<html>
<head>
</head>
<body style="font-size:30px;">
${status}
</body>
</html>

view.jsp

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--
DispatcherServlet的初始化方法在执行时,
会启动spring容器。
contextConfigLocation负责指定spring
配置文件的位置。
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping> </web-app>

web.xml

  <dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>3.2.8.RELEASE</version>
</dependency>
</dependencies>

pom.xml

Unit04: 实战技巧 、 登录的更多相关文章

  1. android内部培训视频_第五节(1)_OA实战之登录界面

    第五节(1):OA实战之登录界面  一.登录界面布局 1.背景图片 2.文本框 3.checkbox 4.按钮 暂未实现点击切换图片效果 <RelativeLayout xmlns:androi ...

  2. Android实战技巧:深入解析AsyncTask

    AsyncTask的介绍及基本使用方法 关于AsyncTask的介绍和基本使用方法可以参考官方文档和Android实战技巧:多线程AsyncTask这里就不重复. AsyncTask引发的一个问题 上 ...

  3. Unity User Group 北京站图文报道:《Unity虚拟现实实战技巧》

    时间来到了盛夏,北京UUG活动也来到了第八期.本次活动的主题为<Unity虚拟现实实战技巧>,为此我们邀请了4位资深的行业大神.这次我们仍然在北京市海淀区丹棱街5号微软大厦举行活动,在这里 ...

  4. C#并行Parallel编程模型实战技巧手册

    一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理和 ...

  5. webpack快速入门——实战技巧:watch的正确使用方法,webpack自动打包

    随着项目大了,后端与前端联调,我们不需要每一次都去打包,这样特别麻烦,我们希望的场景是,每次按保存键,webpack自动为我们打包,这个工具就是watch! 因为watch是webpack自带的插件, ...

  6. webpack快速入门——实战技巧:开发和生产并行设置

    package.json中,devDependencies和dependencies是不同的 devDependencies:开发依赖 dependencies:生产依赖(线上) 1.安装生产环境的依 ...

  7. webpack快速入门——实战技巧:webpack模块化配置

    首先在根目录,新建一个webpack_config文件夹,然后新建entry_webpack.js文件,代码如下: const entry ={}; //声明entry变量 entry.path={ ...

  8. webpack快速入门——实战技巧:优雅打包第三方类库

    下面说两种方法: 一. 1.引入jQuery,首先安装: cnpm install --save jquery 2.安装好后,在我们的entry.js中引入: import $ from 'jquer ...

  9. webpack快速入门——实战技巧:webpack优化黑技能

    1.抽离jquery,vue(多个第三方类库抽离) 修改入口文件(webpack.config.js中) entry: { entry: './src/entry.js', jquery:'jquer ...

随机推荐

  1. hdu 6114 chess(排列组合)

    Chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  2. Vundle简介安装

    body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...

  3. jmeter的三种参数化

    以FTP请求(用户.密码)为例:(其他都相同) 1.文件参数化 使用配置元件中的CSV Data Set Config 配置CSV Data Set Config: 文件中存储ftp登录的用户名和密码 ...

  4. MoreEffectiveC++Item35 条款26: 限制某个class所能产生的对象个数

    一 允许零个或一个对象 我们知道每当即将产生一个对象,我们有一个constructor被调用,那么我们现在想组织某个对象的产生,最简单的方法就是将其构造函数声明成private(这样做同事防止了这个类 ...

  5. 用位运算替代js中的常见操作

    一.补码 所谓补码就是所有位取反: 例如3的二进制表示是:00000011,那么3的补码就是11111100: 对于-3的二进制表示就是3的补码+1:11111101: 所以二进制的负数就是该数的补码 ...

  6. 单一功能学习——百度AI之身份证识别

    以下内容基本是从官方接口文档复制过来的,附带自己封装的代码 时间:2018年4月4日 一.导入工具包 使用maven依赖: <dependency> <groupId>com. ...

  7. python基础(二)----数据类型

    Python基础第二章 二进制 字符编码 基本数据类型-数字 基本数据类型-字符串 基本数据类型-列表 基本数据类型-元组 可变.不可变数据类型和hash 基本数据类型-字典 基本数据类型-集合 二进 ...

  8. matlab load

    参考文献:http://jingyan.baidu.com/article/fec4bce2257963f2618d8bfa.html 对应save,load 命令更加简单. load的方式有三种: ...

  9. HDU1800 hash+去前导0

    注意一:卡map的时间,但是好好写+运气还是可以卡过,哇...求人品爆发 注意二:去前导0,毕竟‘0’也有ASCII码 #include<cstdio> #include<cstdl ...

  10. BZOJ1013 JSOI2008 球形空间产生器sphere 【高斯消元】

    BZOJ1013 JSOI2008 球形空间产生器sphere Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点 ...