SSH
SSH—->
S—->SpringMVC/Struts S—->Spring H—->Hibernate
Spring主要使用用来实现
IOC/DI AOP DAO ORM 为Service提供事务的环境
Hibernate—->HIbernate是一个能过通过操作java对象来达到操作数据库这样的一门技术
Hibernate就是一个持久层的解决方案
Spring中还有一个模块
WEB/WEBMVC模块 这两个模块的主要功能就是用来 对web的一个支持
Web-MVC—–>SpringMVC
MVC—>
M—>Model V——->View C—->Controll
Spring的MVC是用来代替控制层的Servlet的 也就是说Servlet是控制层的一个解决方案
疑问:有了Servlet为什么还要有SpringMVC?
1>:Servlet获取参数只能 :getParameter 直接写对象/可以直接写名字
2>:Servlet实现转发 request.... 直接返回地址/返回一个字符串就可以了
3>:上传文件 servlet 可能就一句话就搞定了
4>:以前文件下载是不是需要返回流 返回一个对象就OK了
5>:以前我们开发是不是在Servlet中药区分你要调用什么方法 SpringMVC给个不同的路径就好了
6>:以前需要写很多的Servlet 只是申明一个核心的Servlet就好了...
7>:以前我们的方法要么访问get post 只要你没有特殊说明get/post
8>:以前数据要放置到域对象 你需要数据财声明对象不需要的话 不申明
9>:以前是不是可以写过滤器 写的拦截器 这个拦截器 还可以动态改变返回数据
10>:SpringMVC还提供了数据校验的功能
11>:无Controll自动转发的问题
SpringMVC是什么?
SpirngMVC是控制层的一个解决方案 是用于替代Servlet/Struts的 从性能来说 SpringMVC应该是效率更高 而且 开发起来相当方便
SpringMVC能干什么?
前面那十一点…..
Spring和SpringMVC的关系是啥? SpringMVC只是Spring的一个模块而已
Spring SpringMVC SpringData SpringBoot SpringCloud
SpringMVC是控制层的一个解决方案,那么问题来了 SpringMVC只能在 WEB工程下运行
SpringMVC的第一个HelloWord程序
1>:首先要使用第三方的框架 首先的导包
Spring-core Spring-web Spring-webmvc Spring-aop
2>:在我们的web.xml配置核心的Servlet
DispatcherServlet
org.springframework.web.servlet.DispatcherServlet
DispatcherServlet
*.action
3>:编写我们SpringMVC的配置文件(在哪里写? 写什么?)
Spring默认的访问路径是在 :就在我们的WEB-INF目录下
文件的名字写什么? 这里的配置文件的名字叫做 web.xml中配置的servlet-name名字-servlet.xml
DispatcherServlet-servlet.xml
写什么内容? SpringMVC只是Spring的一个模块而已 ,所以SpringMVC的配置文件的约束 和Spring是一样的 所以copy就可以了
4>:编写一个类这个类实现 Controll接口 并实现里面的handleRequest方法
5>:在我们的handlerequest方法中 new ModelAndView这个对象
6>:设置返回的页面
7>:配置我们的访问路径
1>:假设要向域对象放置数据
HttpServletResponse response) throws Exception {
ModelAndView modelAndView=new ModelAndView();
modelAndView.addObject("msg","我是小波波....");
modelAndView.setViewName("/index.jsp");
}
2>:做开发的时候一般都是在src目录下建一个文件夹 来专门存放配置文件
注入我们的配置文件的路径
DispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:config/spring-mvc.xml
拓展
1>:就是在我们的Struts中
1.0的版本 默认的访问后缀是 .do
2.0的版本 默认的访问后缀是 .action
2>:SpringMVC中 默认的访问后缀是 .action
SpringMVC的运行 http://127.0.0.1:8080/Day1705_SpringMVC_01/user.action
映射器:是用来获取我们最终的映射路径的 /user.action
多重映射的问题
就是我们的一多个地址是可以对应一个Controll的
userControll
userControll
userControll
userControll
适配器: 找适合我们请求路径的控制器 找的是 你需要的是 实现接口的呢?还是继承类的呢 还是既没有实现接口也没有继承类的
视图解析器:是根基你返回的数据可以来动态的添加后缀的问题
视图解析器 可以用来给返回的字符串添加前后缀
我们SpringMVC的运行
当我们的请求到来的时候 首先的将请求交给映射器 映射器 再将请求交给 适配器 适配器将请求最终找到控制器 控制器处理完成之后将请求交给 视图解析器—>将请求进行返回
免控制器实现转发
我们需要打开一个页面这个页面位于我们的WEB-INF下面 这个下面的请求只能是 转发能够打开这个页面 而且我们只是打开页面不需要进行数据处理
注解模式实现SpringMVC
注解模式实现SpringMVC
1>:
2>:
3>: 编写一个类这个类不用继承 也不用实现任何类
4>:在这个类里面编写控制器的方法 (方法名随便写 但是开发的时候要做到 见名之意) 这个方法返回字符串的类型
5>:在这个类上面使用下面的注解@Controller
6>:在方法上使用下面的注解@RequestMapping(“/back.action”)
7>:返回要跳转的页面
1>:返回一个路径 return "/WEB-INF/index.jsp";
2>:只是返回特殊的字符串 return "index"; 这种前倾也要配置视图解析器
3>:实际上还可以返回对象
返回对象的时候默认的打开页面就是我们映射路径 但是假设我们能够配置前后缀的话那么 这个就可以成功的跳转到一个页面
我们返回的对象会自动的保存到域对象里面 而且保存的对象的名字 就是类的名字的首字母小写
@RequestMapping("/back1.action")
public Object backData(){
System.out.println("王小波到此一游....+add");
return new User("小波波","12346");
}
接受值的问题
1>:如果我们需要 request和response的话那么我们可以 直接在我们申明的方法上直接申明就ok了
@RequestMapping(“/parame01.action”)
public void parame01(HttpServletRequest request,HttpServletResponse response){}
2>;如果我们需要将值放置到 域对象的话那么 可以使用 ModelAndView和 Model这两个对象都是可以的
3>:接受页面传值的方式1:
1>:public String parame04(String uName,String uPassWord){}
2>:假设我们几首的数据要封装成对象的话那么要保证 input中的name和实体类中的属性对应就ok了
public String parame05(User user){}
3>:假设你想将数据封装成对象并且 表单中还有多余的字段那么 直接写名字就ok了
public String parame06(User user,String uName,String uPassWord,String uGender){}
4>:接受数组类型的参数
@RequestMapping("/parame07.action")
public String parame07(String[] ids){
System.out.println(Arrays.toString(ids));
return "index";
}
5>:可以接受集合类型的参数
这个要使用包装类型
public class UserListObj {
private List<User> users = new ArrayList<User>();
}
html代码
<form action="${pageContext.request.contextPath}/parame08.action" method="post">
用户名:<input type="text" name="users[0].uName" />
密码:<input type="text" name="users[0].uPassWord" />
<hr />
用户名:<input type="text" name="users[1].uName" />
密码:<input type="text" name="users[1].uPassWord" />
<hr />
用户名:<input type="text" name="users[2].uName" />
密码:<input type="text" name="users[2].uPassWord" />
<br />
<input type="submit" value="提交数据" />
</form>
接受数据的代码
@RequestMapping("/parame08.action")
public String parame08(UserListObj listObj){
System.out.println(listObj.getUsers());
return "index";
}
假设用户和管理者的属性是一致的并且在同一个controll中的同一个方法中进行数据的获取
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/add.action">userControll</prop>
<prop key="/delete.action">userControll</prop>
<prop key="/update.action">userControll</prop>
<prop key="/query.action">userControll</prop>
</props>
</property>
</bean> -->
重点注解模式
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!--配置扫描器 -->
<context:component-scan base-package="com.zy.controll"></context:component-scan>
<!--设置mvc驱动 -->
<mvc:annotation-driven></mvc:annotation-driven>
</beans>
public class UserControll {
@RequestMapping("/add.action")
public String add() {
System.out.println("调用这个式注解方式");
return "/update.action";
}
@RequestMapping("/update.action")
public String update() {
System.out.println("这个式注解方式");
return "/WEB-INF/index.jsp";
}
@RequestMapping("/delete.action")
public String delete() {
System.out.println("这个式注解方式");
return "/WEB-INF/index.jsp";
}
@RequestMapping("/query.action")
public String query() {
System.out.println("这个式注解方式");
return "/WEB-INF/index.jsp";
}
@RequestMapping("/back.action")
public String back() {
System.out.println("这个式注解方式");
return "index";
}
@RequestMapping("/back1.action")
public Object back1() {
System.out.println("对象");
return new User("曾洋","1561");
}
@RequestMapping("/param01.action")
public void param01(HttpServletRequest request,HttpServletResponse response) throws IOException {
System.out.println("获取部署路径"+request.getContextPath());
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("我是http出来的");
}
@RequestMapping("/param02.action")
public String param02(Model model) {
System.out.println("对象");
model.addAttribute("msg","this is model");
return "index";
}
@RequestMapping("/param03.action")
public ModelAndView param03() {
ModelAndView mView=new ModelAndView();
mView.setViewName("index");
mView.addObject("msg","我是modelview的值");
return mView;
}
@RequestMapping("/param04.action")
public String param04(String uName,String uPwd) {
System.out.println(uName+"--------------------------"+uPwd);
return "index";
}
@RequestMapping("/param05.action")
public String param05(User user) {
System.out.println("这是获取:"+user.getuName()+"--------------------------"+user.getuPwd());
return "index";
}
@RequestMapping("/param06.action")
public String param06(User user,String gender) {
System.out.println("这是获取:"+user.getuName()+"--------------------------"+user.getuPwd()+"................"+gender);
return "index";
}
@RequestMapping("/param07.action")
public String param07(String[] hobbys) {
System.out.println(hobbys[1]);
return "index";
}
@RequestMapping("/param08.action")
public String param08(UserList uList,String[] hobbys) {
System.out.println(hobbys[1]);
System.out.println(uList.getUsers());
return "index";
}
@RequestMapping("/param09.action")
public String param09(UserAndAdmin uAndAdmin) {
System.out.println(uAndAdmin.getUser());
System.out.println(uAndAdmin.getAdmin());
return "index";
}
}