哐哐,前几天写了个文件上传,虽然上传上去了并且显示出来了,但是好像意义不太大,以为显示的内容是没任何格式的,乱七八糟,在丽丽姐姐的要求下,俺还是写了个比较完整版的出题小系统.首先看一下word文档中试卷格式:
T 标题
C语言程序设计第三次课堂测试
}}
{{1<B>单选题
1. 下面函数调用语句含有实参的个数是 。
func( (exp1, exp2), (exp3, exp4,exp5) ) ;
(A)1 (B)2 (C)4 (D)5
}}
{{1<B>单选题
2、写出以下程序的运行结果 。
fun( int a , int b )
{ if (a>b) return( a+b ) ;
else return(a-b); }
main( )
{ int x=3, y=8, z=6, r;
r= fun( fun(x , y), 2*z );
printf(“\n r= %5d\n ”, r );
}
(A)-16 (B)-17 (C)16 (D)17
}}
{{1<C>单选题
3、以下程序的正确运行结果是 。
# include “stdio.h”
void num( )
{ extern int x, y ; int a=15, b=10;
x= a-b; y= a+b;
}
int x, y;
main( )
{ int a= 7, b=5;
x= a +b; y= a-b; num( );
printf( “%d, %d \n”, x, y );
}
(A)12,2 (B)不确定 (C)5,25 (D)1,12
}}
{{ 2<A,B,D>多选题
1.下列关系表达式中结果为真的是 。
(A) 0!=1 (B)2 < = 8
(C)( a = 2*2 ) = =2 (D)y = ( 2+2 ) = = 4
}}
{{2<A,B,C> 多选题
2.设:int x=3 , y=4 , z=5 ; 则下面表达式中值为 1的是 。<br/>
(A) x && y
(B) x<=y
(C) x || y+z && y-z
(D) ! ( ( x<y ) && !z || 1 )
}}
{{3< 0>填充题
当a=3; b=2; c=1; 时,表达式 f=a>b>c 的值是___________.
}}
{{3< 1 >填充题
设a,b,c 均为int 型变量, 且 a=6, b=4, c=2, 则表达式 !( a - b) +c -1 && b+c/2 的值是_________.
}}
{{ 4< (ch>=’A’ && ch<=’Z’ ) ,(ch=ch-32) >多项填充题
以下程序的功能是:输入一个字符,如果它是一个大写字母,则将其转换为小写字母,若它是一个大写字母,则将其转换为小写字母,其他字符不变。请填空。
main( )
{ char ch;
scanf( “%c”, &ch );
if ( 【1】 ) ch = ch + 32;
else if( ch>=’a’ && ch<=’z’ ) 【2】;
printf( “%c”,ch);
}
}}
{{ 5<T>是非题
1.这是是非题.
}}
{{ 5<T>是非题
}}
分析一下:一共五个类型的题,1-单选,2-多选,3-单项填空,4-多项填空,5-是非题.样式是: "题型标号<答案>题型说明题干(选项)".
通过上面的word上传文档已经可以得到word里面的内容,至于怎么处理,就是按照这样的需求做了,其实,更多运用的是正则表达式的方式去处理这个string.
主要思路:
(1)先将string用'{{'分开,完成一个题一个题分开了,放到List里面.
(2)遍历上面的List将每个题分成[答案][题干]([选项])
(3)分开后将这些对应的内容分别放到一个List<String[]>中,其中,list存放每个题,String[]存放题的不同部分,0-答案,1-题干,(2-A选项),(3-B选项),(4-C选项),(5-D选项)
(4)返回前台这个List<String[]>
(5)前台用遍历方式和EL表达式展示出来.不用用struts标签,因为格式会被屏蔽掉.
(6)要注意:word文档中的回车是'\n',但是显示在html中就要是'<br/>',所以,记得将\n替换掉.
最后是相关的程序了:
前台上传文件index.jsp:(和上一次的上传word文档并显示内容相同)
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
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>Demo of upload files</title>
<script type="text/javascript">
function checkup(){
//提示信息
var div=document.getElementById("message");
if(document.form1.upload.value.length==0){
div.innerHTML="请选择要上传的文件";
document.form1.upload.focus();
return false;
}
return true;
}
</script>
<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">
-->
<style>
*{ font-size:14px;}
</style>
</head>
<body>
<form action="UploadAction.action" name="form1" method="post" enctype="multipart/form-data">
<table>
<tr>
<td > </td>
<td ><span id="message" style="font-size:16px;color:red;" >
</span></td>
</tr>
<tr>
<td style="line-height:30px;">选择上传的文件:</td>
<td> <input type="file" id="uploadname" name="upload"></td>
</tr>
<tr>
<td style="line-height:30px;"><input type="submit" name="button" id="button" value="提交" onClick="return checkup();"></td>
<td><input type="reset" name="button2" id="button2" value="重置"></td>
</tr>
</table>
</form>
</body>
</html>
web.xml:(主要是配置struts)
<?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">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
</web-app>
struts.xml文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package namespace="/" name="default" extends="struts-default">
<action name="UploadAction"
class="com.up.action.UploadAction" >
<!-- 将savePath设置为"/upload" -->
<param name="savePath">/upload</param>
<result name="show">/showc.jsp</result>
<result name="error">/index.jsp</result>
</action>
</package>
</struts>
比较重要的UploadAction.java:
package com.up.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.apache.struts2.ServletActionContext;
import org.textmining.text.extraction.WordExtractor;
import com.opensymphony.xwork2.ActionSupport;
public class UploadAction extends ActionSupport {
List<String[]> listcontent1 = new ArrayList<String[]>();//最终单选
List<String[]> listcontent2 = new ArrayList<String[]>();//最终多选题
List<String[]> listcontent3 = new ArrayList<String[]>();//最终填空
List<String[]> listcontent4 = new ArrayList<String[]>();//最终多项填空
List<String[]> listcontent5 = new ArrayList<String[]>();//最终是非题
File upload;
String uploadContentType;
String uploadFileName;
String str;
private String savePath;
public String execute() throws Exception{
/**
* 文件上传
*/
String doc = getFilename(getUploadFileName());
String filename =getTime() + "." + doc;
//文件上传
//getSavepath()是获取struts.xml中传过来的值
FileOutputStream fos = new FileOutputStream(getSavePath() + "\\" + filename);
FileInputStream fis = new FileInputStream(getUpload());
byte[] buffer = new byte[1024];
int len = 0;
while ((len = fis.read(buffer)) > 0)
{
fos.write(buffer , 0 , len);
}
int ch = 0;
String path = ServletActionContext.getServletContext().getRealPath("/upload");
try{
FileInputStream in = new FileInputStream (path + "\\" + filename);
WordExtractor extractor = new WordExtractor();
str = extractor.extractText(in);
// str = str.replaceAll("\n", "<br/>");
List<String> lists = new ArrayList<String>();//所有的
List<String[]> list1 = new ArrayList<String[]>();//单选
List<String[]> list2 = new ArrayList<String[]>();//多选
List<String[]> list3 = new ArrayList<String[]>();//填空
List<String[]> list4 = new ArrayList<String[]>();//多项填空
List<String[]> list5 = new ArrayList<String[]>();//是非题
String[] strs = str.split("\\{\\{");
for(String s : strs){
lists.add(s);
}
for(int i=0;i<lists.size();i++){
String s = lists.get(i);
if(s.contains("1<")){
String[] ss = s.split("^1.*单选题{1}quot;);
list1.add(ss);
}
if(s.contains("2<")){
String[] ss = s.split("^2.*多选题{1}quot;);
list2.add(ss);
}
if(s.contains("3<")){
String[] ss = s.split("^3.*填充题{1}quot;);
list3.add(ss);
}
if(s.contains("4<")){
String[] ss = s.split("^4.*多项填充题{1}quot;);
list4.add(ss);
}
if(s.contains("5<")){
String[] ss = s.split("^5.*是非题{1}quot;);
list5.add(ss);
}
}
/**
* 单选
*/
for(int i = 0;i<list1.size();i++){
for(int j = 0;j<list1.get(i).length;j++){
String[] ti1 = new String[6];
//ti[0]答案,ti[1]题目,ti[2]A,ti[3]B,ti[4]C,ti[5]D
String t = list1.get(i)[j];
int h = list1.get(i)[j].indexOf("<", 0);
int k = list1.get(i)[j].indexOf(">",0);
ti1[0] = list1.get(i)[j].substring(h+1, k);//在<>之间获取答案,然后去掉第一行
int m = t.indexOf("\n", 0);//获取第一行的索引,为了下面去掉第一行做准备
t = t.substring(m);//去掉第一行.
t = t.replaceAll("\n", "<br/>");
t= t.replaceAll("\\}\\}", "");
String[] sti = t.split("[((]+[ABCD]+[))]");
if(sti.length==5){
for(int n = 0;n<sti.length;n++){
ti1[n+1] = sti[n].replaceAll("\n", "<br/>");
}
listcontent1.add(ti1);
}else{
System.out.println("文件格式错误");
}
}
}
/**
* 多选
*/
for(int i = 0;i<list2.size();i++){
for(int j = 0;j<list2.get(i).length;j++){
String[] ti2 = new String[6];
//ti[0]答案,ti[1]题目,ti[2]A,ti[3]B,ti[4]C,ti[5]D
String t = list2.get(i)[j];
int h = list2.get(i)[j].indexOf("<", 0);
int k = list2.get(i)[j].indexOf(">",0);
ti2[0] = list2.get(i)[j].substring(h+1, k);//在<>之间获取答案,然后去掉第一行
int m = t.indexOf("\n", 0);//获取第一行的索引,为了下面去掉第一行做准备
t = t.substring(m);//去掉第一行.
t = t.replaceAll("\n", "<br/>");
t= t.replaceAll("\\}\\}", "");
String[] sti = t.split("[((]+[ABCD]+[))]");
if(sti.length==5){
for(int n = 0;n<sti.length;n++){
ti2[n+1] = sti[n].replaceAll("\n", "<br/>");
}
listcontent2.add(ti2);
}else{
System.out.println("文件格式错误");
}
}
}
/**
* 填空
*/
for(int i = 0;i<list3.size();i++){
for(int j = 0;j<list3.get(i).length;j++){
String[] ti3 = new String[6];
//ti[0]答案,ti[1]题目,ti[2]A,ti[3]B,ti[4]C,ti[5]D
String t = list3.get(i)[j];
int h = list3.get(i)[j].indexOf("<", 0);
// int m = t.indexOf("\n", 0);//获取第一行的索引,为了下面去掉第一行做准备
// String temp = t.substring(1, m);
// int k = 0;
// for(int x=temp.length()-1;x > 0 ;x--){
// char[] c = temp.toCharArray();
// if(c[x]=='>') {
// k = x;
// break;
// }
// }
int k = list3.get(i)[j].indexOf(">",0);
ti3[0] = list3.get(i)[j].substring(h+1, k);//在<>之间获取答案,然后去掉第一行
int m = t.indexOf("\n", 0);//获取第一行的索引,为了下面去掉第一行做准备
t = t.substring(m);//去掉第一行.
t = t.replaceAll("\n", "<br/>");
t= t.replaceAll("\\}\\}", "");
String[] sti = t.split("[((]+[ABCD]+[))]");
if(sti.length==1){
for(int n = 0;n<sti.length;n++){
ti3[n+1] = sti[n].replaceAll("\n", "<br/>");
}
listcontent3.add(ti3);
}else{
System.out.println("文件格式错误");
}
}
}
/**
* 多项填空
*/
for(int i = 0;i<list4.size();i++){
for(int j = 0;j<list4.get(i).length;j++){
String[] ti4 = new String[6];
//ti[0]答案,ti[1]题目,ti[2]A,ti[3]B,ti[4]C,ti[5]D
String t = list4.get(i)[j];
int h = list4.get(i)[j].indexOf("<", 0);
int m = t.indexOf("\n", 0);//获取第一行的索引,为了下面去掉第一行做准备
String temp = t.substring(1, m);
int k = 0;
for(int x=temp.length()-1;x > 0 ;x--){
char[] c = temp.toCharArray();
if(c[x]=='>') {
k = x;
break;
}
}
ti4[0] = list4.get(i)[j].substring(h+1, k);//在<>之间获取答案,然后去掉第一行
t = t.substring(m);//去掉第一行.
t = t.replaceAll("\n", "<br/>");
t= t.replaceAll("\\}\\}", "");
String[] sti = t.split("[((]+[ABCD]+[))]");
if(sti.length==1){
for(int n = 0;n<sti.length;n++){
ti4[n+1] = sti[n].replaceAll("\n", "<br/>");
}
listcontent4.add(ti4);
}else{
System.out.println("文件格式错误");
}
}
}
/**
* 是非题
*/
for(int i = 0;i<list5.size();i++){
for(int j = 0;j<list5.get(i).length;j++){
String[] ti5 = new String[6];
//ti[0]答案,ti[1]题目,ti[2]A,ti[3]B,ti[4]C,ti[5]D
String t = list5.get(i)[j];
int h = list5.get(i)[j].indexOf("<", 0);
int k = list5.get(i)[j].indexOf(">",0);
ti5[0] = list5.get(i)[j].substring(h+1, k);//在<>之间获取答案,然后去掉第一行
int m = t.indexOf("\n", 0);//获取第一行的索引,为了下面去掉第一行做准备
t = t.substring(m);//去掉第一行.
t = t.replaceAll("\n", "<br/>");
t= t.replaceAll("\\}\\}", "");
String[] sti = t.split("[((]+[ABCD]+[))]");
if(sti.length==1){
for(int n = 0;n<sti.length;n++){
ti5[n+1] = sti[n].replaceAll("\n", "<br/>");
}
listcontent5.add(ti5);
}else{
System.out.println("文件格式错误");
}
}
}
}catch(Exception e){
e.printStackTrace();
}
return "show";
}
String getTime(){
/**
* 获取时间来定义文件名称
* @return String as the name of the file
*/
SimpleDateFormat formatter_f = new SimpleDateFormat("yyyyMMddHHmmss");
Date now = new Date();
String time = formatter_f.format(now);
return time;
}
String getTrueTime(){
/**
* 获取当前时间
* @return String time
*/
SimpleDateFormat formatter_f = new SimpleDateFormat("yyyy-MM-dd");
Date now = new Date();
String time = formatter_f.format(now);
return time;
}
String getFilename(String name){
/**
* 获取文件名的后缀
* @return String
*/
int i = name.lastIndexOf(".")+1;
return name.substring(i,name.length());
}
//接受依赖注入的方法
public void setSavePath(String value)
{
this.savePath = value;
}
@SuppressWarnings("deprecation")
private String getSavePath() throws Exception
{
return ServletActionContext.getRequest().getRealPath(savePath);
}
public void setUpload(File upload) {
this.upload = upload;
}
public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
}
public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
}
public File getUpload() {
return (this.upload);
}
public String getUploadContentType() {
return (this.uploadContentType);
}
public String getUploadFileName() {
return (this.uploadFileName);
}
public List<String[]> getListcontent1() {
return listcontent1;
}
public void setListcontent1(List<String[]> listcontent1) {
this.listcontent1 = listcontent1;
}
public List<String[]> getListcontent2() {
return listcontent2;
}
public void setListcontent2(List<String[]> listcontent2) {
this.listcontent2 = listcontent2;
}
public List<String[]> getListcontent3() {
return listcontent3;
}
public void setListcontent3(List<String[]> listcontent3) {
this.listcontent3 = listcontent3;
}
public List<String[]> getListcontent4() {
return listcontent4;
}
public void setListcontent4(List<String[]> listcontent4) {
this.listcontent4 = listcontent4;
}
public List<String[]> getListcontent5() {
return listcontent5;
}
public void setListcontent5(List<String[]> listcontent5) {
this.listcontent5 = listcontent5;
}
}
最后是显示showc.jsp:(其实显示也挺重要的,因为用到了循环)
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
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>Demo of upload files</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">
-->
<style>
*{ font-size:14px;font-weight:bold;}
</style>
</head>
<body>
<FORM action="tree.jsp" method=post name=form>
一.单项选择.<br/><br/>
<s:iterator value="#attr.listcontent1" id="strs">
答案:${strs[0]}
${strs[1]}
<INPUT type="radio" name="R" value="A">A.${strs[2]}
<INPUT type="radio" name="R" value="B">B.${strs[3]}
<INPUT type="radio" name="R" value="C">C.${strs[4]}
<INPUT type="radio" name="R" value="D">D.${strs[5]}
</s:iterator>
二.多项选择.<br/><br/>
<s:iterator value="#attr.listcontent2" id="strs">
答案:${strs[0]}
${strs[1]}
<INPUT type="checkbox" name="R" value="A">A.${strs[2]}
<INPUT type="checkbox" name="R" value="B">B.${strs[3]}
<INPUT type="checkbox" name="R" value="C">C.${strs[4]}
<INPUT type="checkbox" name="R" value="D">D.${strs[5]}
</s:iterator>
三.填空.<br/><br/>
<s:iterator value="#attr.listcontent3" id="strs">
答案:${strs[0]}
<br/>请填写答案:<input type="text"/>${strs[1]}
</s:iterator>
四.多项填空.<br/><br/>
<s:iterator value="#attr.listcontent4" id="strs">
答案:${strs[0]}
<br/>请填写答案:<input type="text"/> ${strs[1]}
</s:iterator>
五.是非题.<br/><br/>
<s:iterator value="#attr.listcontent5" id="strs">
答案:${strs[0]}
请选择答案:<INPUT type="radio" name="R" value="Y">A.是
<INPUT type="radio" name="R" value="N">B.否
${strs[1]}
</s:iterator>
</FORM>
</body>
</html>
这样,基本上一个比较好一点的上传和读取功能就先做好了,嘻嘻,记录记录~~~