发表于: 2018-04-25 23:27:11
1 616
今天完成的事情:
1.安装tomcat
2.配置web.xml,创建Controller接口,查询数据库
REST风格:明显的表现就是可以看到URL里 / XXX / XX / 这样的类似地址,然后使用PUT或者其它方式传递值。
但它不仅仅只是这些,它是一个架构模式,强调以资源为中心,资源——表现,让前后端更好的分离,REST的目的是“建立十年内不会过时的软件系统架构"。
记得好像之前的网页一般都是通过POST?=%?=XX&???之类的分隔符等参数传递,如果是GET方式还能看到内容参数。相较于以前的方式REST更容易看到结构,这也是它的好处,结构清晰,容易理解,而且更方便扩展。
REST风格有四种请求方式,分别是POST/GET/PUT/DELETE方式 对应CRUD
1.首先安装tomcat服务
官网下载的8版本,然后配置环境变量,测试运行。
在idea里配置tomcat:
在Run里找:
如果没有的话就在setting里查找,然后下载:
然后安装后会提示重启,重启后就可以找到了:
配置这里Deployment是一定要的,这里配置的就是项目包:
相当于把你的项目发布到tomcat服务器上,由服务器托管运行
2.使用前台页面查询数据
2.1 配置web.xml:
过滤器 characterEncodingFilter 主要是utf-8字符
filter-mapping是过滤的路径
<filter>
<filter-name>characterEncodingFilter</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
拦截器,拦截请求,发送给Controller,由Controller控制返回页面。
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--指明配置文件,不使用默认配置文件名,使用自定义的配置文件。 默认的配置文件为: /WEB-INF/<servlet-name>-servlet.xml-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
</init-param>
<!--启动顺序,让这个Servlet随Servletp容器一起启动的顺序。-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern> <!--会拦截URL中带“/”的请求。-->
<url-pattern>*.do</url-pattern> <!--会拦截URL中带“*.do”的请求。-->
<!--<url-pattern>*.do</url-pattern>-->
</servlet-mapping>
param是配置文件,dispatcher-servlet.xml就是之前spring的配置applicationcontext.xml文件,但是和之前的xml文件不一样的是需要更为严谨一些。比如开启注解扫描的包需要就添加,不需要就不要添加。单独使用本地项目不会报错,但是使用web请求可能就会多出一些问题。
这里需要添加分发规则:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="suffix" value=".jsp"/>
<property name="prefix" value="/WEB-INF/pages/"/>
</bean>
suffix相当于后缀,prefix相当于路径
然后添加Controller Bean
<bean id="backController" class="controller.BackController"></bean>
2.2 创建Controller控制器类:
@Controller
public class BackController {
Logger logger = Logger.getLogger(BackController.class.getName());
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("springmybatis.xml");
StudentMapper studentMapper = (StudentMapper) applicationContext.getBean("studentMapper");
@RequestMapping(value = "index.do")
public ModelAndView helloTest(@RequestParam("stuName")String str){
ModelAndView modelAndView = new ModelAndView();
System.out.print("\n 输入的查询:" + str + "\n");
Student student = new Student();
student.setName(str);
List<Student> students = studentMapper.findByStudent(student);
System.out.print("\n查询出的数据:" + students.toString());
modelAndView.addObject("students",students);
modelAndView.setViewName("/students");
return modelAndView;
}
也可以使用这样的方式,具体的参数都是根据自己的实际需要来写:
public String selectByNAme(@RequestParam(value = "stuName",required=false) String stuName, Map<String,Object> map){
或者使用其它的传值方式:
@RequestMapping(value = "/selectByName.do",method= RequestMethod.POST)
@ResponseBody
public String selectByNAme(ModelMap model, HttpServletRequest request, HttpServletResponse response) throws IOException {……}
RequestMapping:拦截的请求
这里是使用了RequestParam注解获取信息,参数对应的是jsp里input的name值
查出数据,然后使用ModelAndView返回并且传值给前端页面
modelAndView.addObject("students",students); 相当于添加变量名和变量值
modelAndView.setViewName("/students");ViewName 显示页的名字,因为之前的配置,这里就相当于返回到/WEB-INF/pages/students.jsp页面
Spring有很多传参方法,比如ModelMap, HttpServletRequest, HttpServletResponse,比如在参数里面设置ModelMap ,spring就会自动填充Model,然后需要你在方法里使用它来装配参数,然后就可以使用modelMap.addAttribute("name",student);方式传值给前端使用。
也可以使用JSON格式传值,传Json格式字符串或者Json对象都可以,JSON是比较标准的通用规范:
String jsonStu = JSON.toJSONString(students);
然后使用Map也同样可以传递参数:
@RequestMapping(value = "/selectByName.do",method= RequestMethod.POST)
@ResponseBody
public String selectByNAme(@RequestParam(value = "stuName",required=false) String stuName, Map<String,Object> map){
Student student = new Student();
student.setName(stuName);
List<Student> students = studentMapper.findByStudent(student);
map.put("studentItems",students);
String jsonStu = JSON.toJSONString(students);
map.put("jsonStu",jsonStu);
return "student";
}
JSON 我pom配置的是阿里巴巴的fastjson:
<!--jeson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.32</version>
</dependency>
如果使用Json格式就需要前端转换json格式为js对象或者直接循环来展示。
2.3 前端页面
jsp:
<div class="container">
<div class="row clearfix">
<div class="col-md-12 column ">
<table class="table table-hover" id="tt">
<colgroup style="display: none">
<col style="width:10%">
<col style="width:10%">
<col style="width:10%">
<col style="width:10%">
<col style="width:10%">
<col style="width:10%">
<col style="width:10%">
<col style="width:20%">
<col style="width:10%">
</colgroup>
<thead>
<tr>
<th>姓名</th>
<th>QQ</th>
<th>修真类型</th>
<th>开始时间</th>
<th>学校</th>
<th>线上学号</th>
<th>日报链接</th>
<th>立愿</th>
<th>师兄</th>
</tr>
</thead>
<tbody>
<c:if test="${!empty students}">
<c:forEach items="${students}" var="stu">
<tr>
<td>${stu.name}</td>
<td>${stu.qq}</td>
<td>${stu.type}</td>
<td>${stu.startTime}</td>
<td>${stu.school}</td>
<td>${stu.stuNum}</td>
<td>${stu.dailyLink}</td>
<td>${stu.pro}</td>
<td>${stu.brother}</td>
</tr>
</c:forEach>
</c:if>
<c:if test="${empty students}">
<tr>
<td colspan="9">没有查到信息</td>
</tr>
</c:if>
</tbody>
</table>
</div>
</div>
</div>
或者使用
<c:choose>
<c:when test="${not empty students}">
<c:forEach items="${students}" var="stu" varStatus="st">
<tr>
<td>${stu.name}</td>
<td>${stu.qq}</td>
<td>${stu.type}</td>
<td>${stu.startTime}</td>
<td>${stu.school}</td>
<td>${stu.stuNum}</td>
<td>${stu.dailyLink}</td>
<td>${stu.pro}</td>
<td>${stu.brother}</td>
</tr>
</c:forEach>
</c:when>
<c:otherwise>
<tr>
<td colspan="9">
无查询数据
</td>
</tr>
</c:otherwise>
</c:choose>
展示页面:
查询出的值:
明天计划的事情:
REST风格的CURD,学习spring的参数传递
遇到的问题与收获:
1.不能使用GET方式传值。
Request method 'GET' not supported
解决:修改为POST方式,因为需要获取值查询,所以不能使用GET
2.500错误:方法中没有本地抽象方法或参数属性
HTTP Status 500 – Internal Server Error
Type Exception Report
Message java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/servlet/jsp/jstl/core/ConditionalTagSupport
Description The server encountered an unexpected condition that prevented it from fulfilling the request.
javax.servlet.ServletException: java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/servlet/jsp/jstl/core/ConditionalTagSupport org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339) javax.servlet.http.HttpServlet.service(HttpServlet.java:742) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:170) org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:314) org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1325) org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1069) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1008) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:870) javax.servlet.http.HttpServlet.service(HttpServlet.java:635) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:855) javax.servlet.http.HttpServlet.service(HttpServlet.java:742) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
一直找不到原因,直到看到javax
解决:由于pom导入了javaeeapi,删除javaee就可以了
<!--<dependency>-->
<!--<groupId>javaee</groupId>-->
<!--<artifactId>javaee-api</artifactId>-->
<!--<version>5</version>-->
<!--</dependency>-->
3.前端无法展示数据:
前端的页面:
同样的代码,同样的方法,在别的jsp里可以显示,但是在首页就是无法展示出来:
这里还专门摘出来${itm}对比是否有数据:
<tbody>${itm}
<c:choose>
<c:when test="${not empty itm}">
<c:forEach items="${itm}" var="stu" >
<tr>
<td>${stu.name}</td>
<td>${stu.qq}</td>
<td>${stu.type}</td>
<td>${stu.startTime}</td>
<td>${stu.school}</td>
<td>${stu.stuNum}</td>
<td>${stu.dailyLink}</td>
<td>${stu.pro}</td>
<td>${stu.brother}</td>
</tr>
</c:forEach>
</c:when>
<c:otherwise>
<tr>
<td colspan="9">
无查询数据
</td>
</tr>
</c:otherwise>
</c:choose>
展示的效果(可以看出明显有参数,但是forEach就是无法获取参数):
使用if也是同样:
明显是有参数,但是不知道为何forEach就是无法循环出来,不论是放到for或者其它方式里还是单独拿出来forEach都没有参数,而且使用json的时候也是同样的问题,但是同样的代码,放到student页面就可以执行,不使用forEach直接展示也可以显示出来。
4.json在前端的转换问题和ajax的传值问题:
js ajax提交参数:
function submitName() {
var param = new Object();
param.stuName = jq("stuName").val();
var JsonData = JSON.stringify(param);
alert(param);
jQuery.ajax({
type:"post",
url:"/selectByNAme.do",
data:JsonData,
dataType:"text",
contentType:"application/jeson",
success:function(data){
alert(data);
}
});
//document.getElementById("cxform").sumit();
}
后台转换和前台转换不清楚,前台循环json需要拼接字符串,比较麻烦。继续学习。
评论