您的位置:首页 > 大数据

大数据正式33

2017-12-25 16:19 441 查看

大数据正式33

SpringMVC

Servlet缺点

一个Servlet有8行配置文件

一个Servlet只能处理一个业务

一张表可能有4+n个Servlet,所以会有32+n行配置文件

获取属性只能得到字符串类型,需要自己转换类型

获取参数只能是request.getParameter()

SpringMVC优点

不管工程中有多少servlet,只需要配置一个servlet分发器即可

springmvc中使用controller替代一个controller

获取参数的类型支持自动装换,而且支持对象的自动封装

SpringMvc有多种获取参数的方式

SprigMVC入门案例

jar包



项目结构



整体流程



代码

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <!-- servlet分发器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<!-- 分发器 -->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 注入配置文件的地址:创建spring容器 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/applicationContext-mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- /或*.action -->
<url-pattern>*.action</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>


applicationContext-mvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd ">
<!-- 扫描包 -->
<context:component-scan base-package="com.peng"></context:component-scan>
<!-- 扫描注解 -->
<context:annotation-config></context:annotation-config>

<bean name="/hello.action" class="com.peng.controller.HelloController"></bean>
</beans>


com.peng.controller

HelloController

package com.peng.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class HelloController implements Controller {

public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("index.jsp");
modelAndView.addObject("msg", "hello");
return modelAndView;
}
}


index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>

<body>
This is my JSP page.
<br>
<h1>${msg}</h1>
</body>
</html>


访问名称
http://localhost/SpringMVC_inroom/hello.action(注:端口为80)
执行结果



注解形式的SpringmMVC

package com.peng.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {
@RequestMapping("/hello.action")
public String helloAction(Model model) {
model.addAttribute("msg", "hello,world!");
return "index";
}
}

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd ">
<!-- 扫描包 -->
<context:component-scan base-package="com.peng"></context:component-scan>
<!-- 扫描注解 -->
<context:annotation-config></context:annotation-config>
<!-- SpringMVC的注解开关 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 资源解析器 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>

添加前后缀的SpringMVC(applicationContext-mvc.xml)

<!-- 资源解析器 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"></property>
<property name="suffix" value=".jsp"></property>
</bean>

解决乱码--过滤器(web.xml)

<!-- 乱码过滤器 -->
<filter>
<filter-name>characterFilter</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>characterFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

数据的获取

HttpServletRequest对象的getParameter方法

package com.peng.controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class UserController {
@RequestMapping("/showAddUser.action")
public String showAddUser() {
return "addUser";
}

@RequestMapping("/addUser.action")
public String addUser(HttpServletRequest request, Model model) {
String username = request.getParameter("username");
System.out.println(username);
model.addAttribute("username", username);
return "addUser";
}
}


与表单的name值一样的参数String username

参数名来控制

package com.peng.controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class UserController {
@RequestMapping("/showAddUser.action")
public String showAddUser() {
return "addUser";
}

@RequestMapping("/addUser.action")
public String addUser(String username, Model model) {
System.out.println(username);
model.addAttribute("username", username);
return "addUser";
}
}


bean对象 User

参数名来控制

package com.peng.controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class UserController {
@RequestMapping("/showAddUser.action")
public String showAddUser() {
return "addUser";
}

@RequestMapping("/addUser.action")
public String addUser(User user, Model model) {
System.out.println(user.username);
model.addAttribute("username", user.username);
return "addUser";
}
}


对象中的对象

参数名来控制

dog.name

gog.age

class Dog{
private String name;

public void setName(String name){
this.name=name;
}

public String getName(){
return this.name;
}
}

class User{
private dog;

public void setDog(Dog dog{
this.dog=dog;
}

public Dog getDog(){
return this.dog;
}
}

package com.peng.controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class UserController {
@RequestMapping("/showAddUser.action")
public String showAddUser() {
return "addUser";
}

@RequestMapping("/addUser.action")
public String addUser(String username, Model model) {
System.out.println(user.dog.name);
model.addAttribute("username", user.dog.name);
return "addUser";
}
}


日期问题

格式问题

2017/12/25这个错误;
2017-12-25这个可以;


解决(Controller中)

@InitBinder
public void InitBinder(ServletRequestDataBinder srdb) {
srdb.registerCustomEditor(java.util.Date.class, new CustomDateEditor(
new SimpleDateFormat("yyyy-MM-dd"), true));
}


参数的同名提交

String

a,b,c


例子

@RequestMapping("/addUser.action")
public String addUser(
HttpServletRequest request,
Model model,
Date date,
String like) {
String username = request.getParameter("username");
System.out.println(username + date.toString() + like);
model.addAttribute("username", username);
return "addUser";
}


String[]

{a,b,c}数组形式


例子

@RequestMapping("/addUser.action")
public String addUser(
HttpServletRequest request,
Model model,
Date date,
String[] like) {
String username = request.getParameter("username");
System.out.println(username + date.toString() + Arrays.toString(like));
model.addAttribute("username", username);
return "addUser";
}


参数名称不一致的问题

问题呈现

form表单提交过来的name和参数中的name值不相同时--因为要见名知义,稍微改动了参数的名称

@RequestParam("hobby")String[] hobbies

@RequestParam

value--对应form中的name值

defaultValue--默认的值

require--必须传过来时有参数

例子

@RequestMapping("/addUser.action")
public String addUser(
HttpServletRequest request,
Model model,
Date date,
@RequestParam(value = "like", defaultValue = "啥也不喜欢!") String[] likes) {
String username = request.getParameter("username");
System.out.println(username + date.toString() + Arrays.toString(likes));
model.addAttribute("username", username);
return "addUser";
}


文件上传

注意的坑

form中的参数

method:post

enctype:multipart/form-data

file文件标签

必须有name属性

文件解析器

必须有id属性

id属性的值必须是:multipartResolver

改三个地方

jsp中

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML >
<html>
<head>
<title>Add User</title>
</head>

<body bgcolor="#0000ff" text="#ffffff">
<form action="addUser.action" method="POST"
enctype="multipart/form-data">
<table border="1">
<tr>
<td>用户名:</td>
<td><input type="text" name="username" />
</td>
</tr>
<tr>
<td>时间:</td>
<td><input type="date" name="date" />
</td>
</tr>
<tr>
<td>上传文件:</td>
<td><input type="file" name="file" />
</td>
</tr>
<tr>
<td>爱好:</td>
<td>篮球<input type="checkbox" name="like" value="basketball" />
足球<input type="checkbox" name="like" value="football" /> 乒乓球<input
type="checkbox" name="like" value="pingpangball" />
</tr>
<tr>
<td>提交:</td>
<td><input type="submit" value="确认" />
</td>
</tr>
</table>
</form>
</body>
</html>


解析器(必须有id和class)

<!-- 文件上传解析器 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"></property>
<property name="maxUploadSize" value="10485760000"></property>
<property name="maxInMemorySize" value="40960"></property>
</bean>


后台

package com.peng.controller;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;

import org.apache.commons.io.FileUtils;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

@Controller
public class UserController {
@RequestMapping("/showAddUser.action")
public String showAddUser() {
return "addUser";
}

@RequestMapping("/addUser.action")
public String addUser(@RequestParam MultipartFile file) throws IOException {
FileUtils.writeByteArrayToFile(new File(
"C:\\Users\\Administrator.PC-20160710IJPJ\\Desktop\\haha.png"),
file.getBytes());
System.out.println(file.toString());
return "addUser";
}

@InitBinder public void InitBinder(ServletRequestDataBinder srdb) { srdb.registerCustomEditor(java.util.Date.class, new CustomDateEditor( new SimpleDateFormat("yyyy-MM-dd"), true)); }}


请求和重定向

默认是转发

重定向--不能直接写界面,尤其是WEB-INF下的界面

return "redirect:请求"
return "redirect:addUser.action"


补充

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: